今天開始學習字典樹,順便做做筆記,等多刷幾道題再來更新一波經驗字典樹,又稱單詞查詢樹、字首樹、鍵樹,是一種樹形結構,是一種雜湊樹的變種。
1)根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。
2)從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。
3)每個節點的所有子節點包含的字元都不相同
4)它的key都為字串,能做到高效查詢和插入,時間複雜度為o(k),k為字串長度,缺點是如果大量字串沒有共同字首時很耗記憶體。
最大限度地減少無謂的字串比較,查詢效率比雜湊表高
空間換時間
利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。
1、自動補全(單詞自動補全)
2、拼寫檢查(檢查單詞是否拼寫正確)
3、ip路由(最長字首匹配)
4、九宮格打字**(根據字首**單詞)
雜湊表搜尋單詞不能實現:
而且隨著雜湊表大小的增加,會出現大量的衝突,時間複雜度可能會增加到o(n)。
具體**實現:可以參考力扣【208、實現字典樹】
class
trie
//插入單詞
public
void
insert
(string word)
//查詢單詞是否存在
public
boolean
search
(string word)
//查詢以prefix字串為字首的單詞是否存在
public
boolean
startswith
(string prefix)
}
class
trie
//插入單詞
public
void
insert
(string word)
//包含當前節點,跳到下一節點
curr = curr.next[c -
'a'];}
curr.isend =
true;}
//查詢單詞是否存在
public
boolean
search
(string word)
curr = curr.next[c -
'a'];}
return curr.isend;
}//查詢以prefix字串為字首的單詞是否存在
public
boolean
startswith
(string prefix)
curr = curr.next[c -
'a'];}
return
true;}
}/**
* your trie object will be instantiated and called as such:
* trie obj = new trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startswith(prefix);
*/
end:表示以當前節點為結尾的單詞的個數
public
class
trie
}private trienode root;
public
trie()
public
void
insert
(string word)
node = node.next.
get(ch)
; node.path++;}
node.end++;}
public
boolean
search
(string word)
if(node.end ==0)
return
false
;return
true;}
public
boolean
startswith
(string word)
return
true;}
}
資料結構設計之實現 trie (字首樹)[sumatran rhinoceros]
208. 實現 trie (字首樹) 包括insert、search、startwith、delete四種操作
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...
字典樹 trie樹
amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...