Trie 字典樹 的侃侃

2022-04-29 06:03:08 字數 2149 閱讀 2311

字典樹 : 見名知意(在樹上進行查詢)。

跟字典相關的必定與查詢有密切的關係,

查詢就需要一定的媒介作為支撐,樹就為這種查詢提供支撐。

實現字串快速檢索的多叉樹結構。

常見的字串轉化:小寫字母或者大寫字母組成的字串,數字組成的字串,01編碼組成的字串。

trie 的每個節點都擁有若干個字元指標,就是說每個節點有多個子節點,通俗一點就是相當於古代

的大少爺可以有多個妻子。

1、插入(將乙個字串插入到字典樹上)

2、檢索(檢索乙個字串 s 在trie 上是否存在)

假設有單詞 : cab , cef , da 這樣三個單詞,那麼這樣三個單詞組成的圖是什麼樣的呢 ?

看下圖 : (通常還要在末尾進行標記一下,表示到字串的末尾)

插入 : 

像每個單詞拼寫一樣,單詞的開頭就相當於是我們的根,從根節點出發,向兒子節點前進。

在向下走的過程中,看有沒有當前這個字元的節點,如果有這個節點,就順著這個節點繼續

往下走,如果沒有這個節點,就在這個節點之下再建立乙個節點。

拿乙個例子來說:

比如上圖的 cab 和 cef, 先插入第乙個字串,從根節點出發,第乙個字元是 c,我們發

現沒有這個字元的節點,所以建立乙個節點,將指標節點進行指向,然後一直向下移動,知道

字串結尾。再插入第二個字串,先檢測第乙個字元是否存在,我們發現存在,所以不用

建立,直接向下移動指標節點即可。

可以發現:

乙個節點最多可以有26個孩子。

檢索:只需要將字串遍歷一遍,順著根節點下來看這條路徑上是否有不存在的值,即 0,如果

沒有到末尾就發現有 0 ,說明這個字串不存在,反之即存在。

插入:

void insert(char str) 

end[p] = true; // 在末尾進行標記

return ;

}

檢索:

bool query(char str)  else 

} return true;

}

題目描述:給定n個字串s1,s2…sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1~sn中有多少個字串是t的字首。

輸入字串的總長度不超過106,僅包含小寫字母。

輸入格式

第一行輸入兩個整數n,m。

接下來n行每行輸入乙個字串si。

接下來m行每行乙個字串t用以詢問。

輸出格式

對於每個詢問,輸出乙個整數表示答案。

每個答案佔一行。

輸入樣例:

3 2ab

bcabc

abcefg

輸出樣例:20

析題得說: 統計每個字串出現的個數即可,用乙個cnt陣列記錄每個字串出現的個數,然後進行檢索要處理的字串,累加結果(模板題)

ac**:

#include #include #include #include #include using namespace std;

const int size = 1e6 + 10;

int trie[size][26],cnt[size];

char str[size];

int n,m,idx = 0;

int main(void)

while(m --)

return 0;

} void insert()

cnt[p] ++; // 統計該字串的個數

return ;

}int query() else

} return res;

}

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新...