數據結構-Trie 字典樹

2021-02-23 MegalithTech

        字典樹主要用於存儲字符串,查找速度主要字符串元素(單詞)的長度有關O(w)。字符串的推薦系統,可以通過字典樹來實現,也是一種深度優先搜索單詞的方法。利用字符串公共前綴來查詢單詞,進行搜尋引擎推薦。字典樹的查詢效率非常高,但是大量的數組並沒有元素,空間利用率低,是典型的空間換時間。

Trie中節點的定義:

    1. 單詞是否結束

    2. 前綴/單詞

    3. 記錄單詞數量

    4. 孩子節點,每個節點都有26個指向下個節點的指針,26個代表有26個字母的可能

/**
* 字典樹!!!======================================================!!!
*/
/**
* 字典樹節點
*/
private static class TrieNode {
//單詞是否結束
private boolean end;
//單詞
private String prefix;
//單詞可重複,數量
private int count;
//孩子節點
private TrieNode[] children = new TrieNode[26];
}

/**
* 字典樹
*/
private static class Trie {
//根節點
private TrieNode root = new TrieNode();
/**
* 插入單詞
*
* @param products
*/
private void insertWord(String[] products) {
for (String p : products) {
insertWord(p);
}
}

private void insertWord(String product) {
TrieNode node = root;
for (char c : product.toCharArray()) {
if (node.children[c - 'a'] == null) {
node.children[c - 'a'] = new TrieNode();
}
node = node.children[c - 'a'];
}
if (!node.end) {
node.end = true;
node.prefix = product;
}
node.count++;
}

/**
* 查詢單詞
*
* @param searchWord
* @return
*/
private List<List<String>> searchWord(String searchWord) {
List<List<String>> result = new ArrayList<>(searchWord.length());
for (int i = 0; i < searchWord.length(); i++) {
result.add(searchPrefix(searchWord.substring(0, i + 1)));
}
return result;
}

/**
* 查詢單詞前綴
*
* @param pattern
* @return
*/
private List<String> searchPrefix(String pattern) {
List<String> temp = new ArrayList<>();
TrieNode node = root;
for (char c : pattern.toCharArray()) {
if (node.children[c - 'a'] == null) {
return temp;
}
node = node.children[c - 'a'];
}
suggest(node, temp);
return temp;
}

/**
* 遞歸深度優先搜索單詞
*
* @param node
* @param temp
*/
private void suggest(TrieNode node, List<String> temp) {
if (node.end) {
for (int i = 0; i < node.count; i++) {
temp.add(node.prefix);
if (temp.size() == 3) {
return;
}
}
}
for (TrieNode t : node.children) {
if (t != null) {
suggest(t, temp);
}
//注意這裡也需要添加==3的判斷,否則會繼續遞歸,導致size>3
if (temp.size() == 3) {
return;
}
}
}
}

相關焦點

  • Trie 樹是什麼樣的數據結構?有哪些應用場景?
    ,又稱前綴樹或字典樹,是一種有序樹,用於保存關聯數組,其中的鍵通常是字符串。與二叉查找樹不同,鍵不是直接保存在節點中,而是由節點在樹中的位置決定。一個節點的所有子孫都有相同的前綴,也就是這個節點對應的字符串,而根節點對應空字符串。讓我們一起來學習下它吧。一、什麼是Trie樹Trie樹,又叫字典樹、前綴樹(Prefix Tree)、單詞查找樹 或 鍵樹,是一種多叉樹結構。
  • 「算法與數據結構」Trie樹之美
    前言這次分享的Trie字典樹,是數據結構專題中的一個分支,認識了解Trie這種樹型數據結構,對構建算法與數據結構知識體系有一定的幫助。我對Trie樹的理解:把字符串都串接起來,消滅不必要的存儲,利用的就是字符串的公共前綴。
  • Trie樹結構
    一個節點的所有子孫都有相同的前綴,也就是這個節點對應的字符串,而根節點對應空字符串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部節點所對應的鍵才有相關的值。Trie這個術語來自於retrieval。根據詞源學,trie的發明者Edward Fredkin把它讀作英語發音:/ˈtriː/ "tree"。
  • 什麼是 Trie 樹?
    節點 n 存在子節點 o,不用重新創建子節點 o。節點 v 不存在子節點 a,創建子節點 a。並將該節點標記為字符串結束標誌,完成 nova 字符串插入。情況一:待刪除的字符串末尾為葉節點,且與其它字符串無公共前綴。將節點逐一刪除即可,例如刪除 cat。情況二:待刪除字符串末尾不是葉節點。將字符串標誌位置為 false 即可,例如刪除 no 。情況三:待刪除字符串末尾為葉節點,並且中間有其它單詞。
  • 深入理解Trie樹
    前言前面的文章介紹過各種高效的的數據結構,比如二叉搜索樹,AVL樹,紅黑樹,B樹,跳躍表等,今天我們再來學習一種多路樹,叫做Trie樹。
  • 字典樹 Trie Tree
    字典樹 Trie Tree 就是一個典型的記錄詞頻和前綴的數據結構。字典樹 Trie Tree字典樹,又稱前綴樹,通常用於詞頻統計、前綴統計、去重、排序等。如圖所示:圖中表示一棵 TrieTree,每個節點中的數字表示以該節點結尾的單詞的頻率,例如 go 單詞出現了4次。
  • 淺談樹形結構:多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
    2.Linux內核的完全公平調度器3.Linux中epoll機制的實現…堆堆是一種特殊的數據結構,它滿足兩個特性:堆是一個完全二叉樹;堆中每一個節點的排序值都必須大於等於(或小於等於)其左右子節點的排序值。這裡解釋一下完全二叉樹。
  • 多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
    應用場景:1.堆排序2.TopK,求中位數,求3.合併多個有序小文件或集合4.優先隊列,如定時任務的存儲等…Trie樹Trie樹 又稱前綴樹或字典樹,它是一種專門處理字符串匹配的數據結構,用來解決在一組字符串集合中快速查找某個字符串的問題。
  • 數據結構快速盤點 - 非線性結構
    樹其實是一種特殊的圖,是一種無環連通圖,是一種極大無環圖,也是一種極小連通圖。從另一個角度看,樹是一種遞歸的數據結構。而且樹的不同表示方法,比如不常用的長子 + 兄弟法,對於 你理解樹這種數據結構有著很大用處, 說是一種對樹的本質的更深刻的理解也不為過。
  • 數據結構與算法-2
    DFS定義:廣度優先搜索同樣也適合用在樹(圖/狀態集)中尋找特定節點。每一條路走到底,再往回走看是否有其它的路徑,再走到底往回走是否有路。類比:DFS就是我們選擇好一個領域後,把它徹底研究透徹在研究其它領域。
  • Python數據結構中的字典
    @Author:Runsen今天,我們學習Python中的數據結構中的字典Python數據結構中的字典字典由鍵值對組成,鍵必須是唯一的;>eg: d = {key1:value1, key2:value2};空字典用{}表示;字典中的鍵值對是沒有順序的,如果想要一個特定的順序,那麼使用前需要對它們排序;d[key] = value,如果字典中已有key,則為其賦值為value,否則添加新的鍵值對key/value;
  • 這是一顆Trie Tree!
    因為它和一般的多叉樹不一樣,尤其在結點的數據結構設計上,比如一般的多叉樹的結點是這樣的:struct TreeNode { VALUETYPE value; //結點值 TreeNode* children[NUM]; //指向孩子結點};而 Trie 的結點是這樣的(假設只包含'a'~'z'中的字符):struct
  • 知道這三個數據結構就夠了
    基於這兩個需求,今天文摘菌就來給大家介紹三個討巧的數據結構。面試當中一提,那可是相當撐場面。這三個數據結構就是。登登登等…1. 布隆過濾器(bloom filter) 2. 前綴樹(prefix trie)3. 環形緩衝(ring buffer)先來說一下,為什麼挑了這三個數據結構。
  • 看動畫輕鬆理解「Trie樹」
    Trie樹Trie這個名字取自「retrieval」,檢索,因為Trie可以只用一個前綴便可以在一部字典中找到想要的單詞。  雖然發音與「Tree」一致,但為了將這種 字典樹 與 普通二叉樹 以示區別,程式設計師小吳一般讀「Trie」尾部會重讀一聲,可以理解為讀「TreeE」。Trie樹,也叫「字典樹」。顧名思義,它是一個樹形結構。它是一種專門處理字符串匹配的數據結構,用來解決在一組字符串集合中快速查找某個字符串的問題。
  • 圖解:數據結構中的各種「樹」,你都心中有數嗎?
    我們在學習數據結構時候,會遇到各種各樣的基礎數據結構,比如堆棧、隊列、數組、鍊表、樹...這些基本的數據結構類型有各自的特點,不同數據結構適用於解決不同場景下的問題。今天就帶大家一起學習下,數據結構中的各種「樹」,這也是面試中經常考查的內容,手撕二叉樹是常規套路,對候選人也很有區分度,學完這篇文章,相信大家都會心中有「樹」了。從樹說起什麼是樹?現實中的樹大家都見過,在數據結構中也有樹,此樹非彼樹,不過數據結構的樹和現實中的樹在形態上確實有點相像。
  • 圖解:數據結構中的6種「樹」,你心中有數嗎?
    數據結構這門課程是計算機相關專業的基礎課,數據結構指的是數據在計算機中的存儲、組織方式。我們在學習數據結構時候,會遇到各種各樣的基礎數據結構,比如堆棧、隊列、數組、鍊表、樹...這些基本的數據結構類型有各自的特點,不同數據結構適用於解決不同場景下的問題。
  • Redis字典的數據結構和實現方式的精華
    由於Redis使用的是C語言,沒有內置的字典,Redis自己實現了字典,具體總結如下:結構說明:(1)Redis 中每個 hash 可以存儲 232(3)Redis字典的dict結構中dictht,ht[2].Ht屬性是一個包含兩個項的數組,數組中的每個項都是一個dictht哈希表,一般情況下,字典只使用ht[0]哈希表,ht[1]哈希表只會在對ht[1]哈希表進行rehash時使用。
  • 圖解:計算機數據結構中的 6 種「樹」,你心中有數了嗎?
    我們在學習數據結構時候,會遇到各種各樣的基礎數據結構,比如堆棧、隊列、數組、鍊表、樹...這些基本的數據結構類型有各自的特點,不同數據結構適用於解決不同場景下的問題。今天就帶大家一起學習下,數據結構中的各種「樹」,這也是面試中經常考察的內容,手撕二叉樹是常規套路,對候選人也很有區分度,學完這篇文章,相信大家都會心中有「樹」了。從樹說起什麼是樹?現實中的樹大家都見過,在數據結構中也有樹,此樹非彼樹,不過數據結構的樹和現實中的樹在形態上確實有點相像。
  • 小白學 Python(12):基礎數據結構(字典)(上)
    人生苦短,我選Python前文傳送門小白學 Python(1):開篇小白學 Python(2):基礎數據類型(上)小白學 Python(3):基礎數據類型(下)小白學 Python(4):變量基礎操作小白學 Python(5):基礎運算符(上)小白學 Python(6):基礎運算符(下)小白學 Python(7):基礎流程控制(上)小白學 Python(8):基礎流程控制(下)小白學 Python(9):基礎數據結構(列表)(上)小白學 Python(10):
  • 圖解:數據結構中的6種「樹」,檸檬問你心中有數嗎?
    數據結構這門課程是計算機相關專業的基礎課,數據結構指的是數據在計算機中的存儲、組織方式。我們在學習數據結構時候,會遇到各種各樣的基礎數據結構,比如堆棧、隊列、數組、鍊表、樹...這些基本的數據結構類型有各自的特點,不同數據結構適用於解決不同場景下的問題。