T樹是一種樹形結構,典型應用是統計,排序,查找大量數據。核心是空間換時間。
結合閆蔚敏的書,我對它的理解是這樣的
舉個例子,比如現在有個含有若干QQ號的文件,現在給你一個QQ號,要你在這個文件裏找出文件裏是否有給你的QQ號,如果有,輸出位置。如果沒有,輸出-1。(假設內存能夠容納下這個文件)
QQ號可能存在的位數是6位—13位,每一位存在的可能性爲0~9,那麼我們可以建一個T樹,第一層爲位數,有8個元素,這八個元素指向不同的數組。第二層有10個元素,代表着第一位的0~9,10個元素又指向不同的數組,第三層也是10個元素,也是代表着第二位的0~9。以此類推。從第六層開始數組要增加一個元素(因爲這個QQ號就匹配成功了,放一個標誌位)。這樣一來,建樹成功。然後就開始查找。查找結果寫入文件,則道題就解決了。
CSDN上還有一種處理辦法:他建立了一個聯合體,裏邊還包含兩個結構體,分別包含了分支結構和節點結構。與上文的我的相比,它的架構更加豐滿些。建樹的時候能夠直接把該字符串放進樹裏。
該結構體如下
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,最後用小根堆進行排序。