T树是一种树形结构,典型应用是统计,排序,查找大量数据。核心是空间换时间。
结合闫蔚敏的书,我对它的理解是这样的
举个例子,比如现在有个含有若干QQ号的文件,现在给你一个QQ号,要你在这个文件里找出文件里是否有给你的QQ号,如果有,输出位置。如果没有,输出-1。(假设内存能够容纳下这个文件)
QQ号可能存在的位数是6位—13位,每一位存在的可能性为0~9,那么我们可以建一个T树,第一层为位数,有8个元素,这八个元素指向不同的数组。第二层有10个元素,代表着第一位的0~9,10个元素又指向不同的数组,第三层也是10个元素,也是代表着第二位的0~9。以此类推。从第六层开始数组要增加一个元素(因为这个QQ号就匹配成功了,放一个标志位)。这样一来,建树成功。然后就开始查找。查找结果写入文件,则道题就解决了。
上还有一种处理办法:他建立了一个联合体,里边还包含两个结构体,分别包含了分支结构和节点结构。与上文的我的相比,它的架构更加丰满些。建树的时候能够直接把该字符串放进树里。
该结构体如下
typedef struct TrieNode
{
NodeKind kind;
Union
{
struct {KeyType K; Record *infoptr;} lf;//叶子节点
struct {TrieNode *ptr[27]; int num;} bh;//分支节点
};
}TrieNode,*TrieTree
我们可以看到,在整个查找的过程中,最坏情况下的时间复杂度为O(l),l代表着树的深度。
继续讨论。如果给出1000W个查询串,每个查询串的字节数为1~255,但是去除重复和,只有300W个。现在要求统计出最热门的10个查询串,使用空间不能超过1G。
步骤一:先建立T树,然后遍历一遍。若没有出现这其标志位置为0,最后用小根堆进行排序。