Mysql字首樹 字首樹(Trie樹,字典樹)

2021-10-18 10:26:44 字數 3840 閱讀 7155

給出字串,如「abc」

從頭結點開始,依次檢查,有沒有走向a的路,如果沒有,就新建出來,a作為路上的值(不是結點的值),如果有的話,就復用

在字串的結尾處的結點的值+1,表示有乙個是以該字串結尾的

1.可以查是否某個字串是以某個字串為字首的

2.還可以查 新增了幾次該字首  (有多少字串是以該結點結尾的)

3.還可以查有多少個字串是以字串作為字首的(字首的詞頻是多少)(有多少字串到達過該結點)

插入字串:public void insert(string str)

刪除字串:public void delete(string str)

在字首樹中查詢字串出現的次數:public int search(string str)

在字首樹中查詢以str字串為字首的個數:public int prefixnumber(string str)

public class trietree {

//字首樹的結構

public static class trienode{

//表示掃過當前結點多少次

public int path;

//表示以當前結點結尾的次數

public int end;

//表示當前結點的下乙個結點(從a-z) 同時,陣列中對應的位置就是a-z字母的順序

// 如果想表示其他型別的,可以使用hashmap nexts;

// key表示的是邊的ascii碼,value表示對應的下乙個結點

public trienode nexts;

public trienode(){

path = 0;

end = 0;

nexts = new trienode[26];

public static class trie{

//字首樹的頭結點 為空

private trienode root;

public trie(){

root = new trienode();

* 將乙個字串加入字首樹,即向字首樹中新增路徑和結點,

* 首先檢查字首樹中是否含有當前結點,

* 如果存在的話,則將其路徑上的path++,end++,

* 如果不存在某幾個結點的話,則建立出來

* @param str

public void insert(string str){

if(str == null || str.length() == 0) return;

char ch = str.tochararray();

trienode trienode = root;

for(int i = 0; i < ch.length; i++){

int index = ch[i] - 'a';

//該元素不存在,則建立出來

if(trienode.nexts[index] == null){

trienode.nexts[index] = new trienode();

trienode = trienode.nexts[index];

trienode.path++;

trienode.end++;

* 刪除指定字串對應在字首樹中的路徑

* 在字首樹中查詢,然後依次將其path-1,

* 當path==0時,直接將其置為null即可(後面的結點都可以不要了)

* @param str

public void delete(string str){

if(str == null || str.length() == 0) return;

char ch = str.tochararray();

trienode trienode = root;

for(int i = 0; i < ch.length; i++){

int index = ch[i] - 'a';

if(--trienode.nexts[index].path == 0){

trienode.nexts[index] = null;

return;

trienode = trienode.nexts[index];

trienode.end--;

* 查詢乙個字串在字首樹**現了多少次

* 如果一路下來都存在,則返回end中的值,

* 如果過程中含有不存在的值,則返回0

* @param str

* @return

public int search(string str){

if(str == null || str.length() == 0) return 0;

char ch = str.tochararray();

trienode trienode = root;

for(int i = 0; i < ch.length; i++){

int index = ch[i] - 'a';

if(trienode.nexts[index] == null) return 0;

trienode = trienode.nexts[index];

return trienode.end;

* 查詢以str為字首的字元有多少

* 即查詢以str為路徑的path是多少

* @param str

* @return

public int prefixnumber(string str){

if(str == null || str.length() == 0) return 0;

char ch = str.tochararray();

trienode trienode = root;

for(int i = 0; i < ch.length; i++){

int index = ch[i] - 'a';

if(trienode.nexts[index] == null) return 0;

trienode = trienode.nexts[index];

return trienode.path;

public static void main(string args) {

trie trie = new trie();

system.out.println(trie.search("zuo"));

trie.insert("zuo");

system.out.println(trie.search("zuo"));

trie.delete("zuo");

system.out.println(trie.search("zuo"));

trie.insert("zuo");

trie.insert("zuo");

trie.delete("zuo");

system.out.println(trie.search("zuo"));

trie.delete("zuo");

system.out.println(trie.search("zuo"));

trie.insert("zuoa");

trie.insert("zuoac");

trie.insert("zuoab");

trie.insert("zuoad");

trie.delete("zuoa");

system.out.println(trie.search("zuoa"));

system.out.println(trie.prefixnumber("zuo"));

trie樹(字首樹)

trie 樹,又稱字典樹,單詞查詢樹。它 於retrieval 檢索 中取中間四個字元構成 讀音同try 用於儲存大量的字串以便支援快速模式匹配。主要應用在資訊檢索領域。trie 有三種結構 標準trie standard trie 壓縮trie 字尾trie suffix trie 這裡只將前兩種...

Trie 字典樹 字首樹

所有的php檔案放到同乙個目錄下 trie charmap.php map.php stdmap.php trie.php trienode.php index.php test.php words.txt trienode.php class trienode 字典樹是利用字串的公共字首來節約儲存...

Trie 字典樹 字首樹

目錄trie是乙個多叉樹,trie專門為處理字串而設計的。使用我們之前實現的二分搜尋樹來查詢字典中的單詞,查詢的時間複雜度為o logn 如果有100萬 220 個單詞,則logn大約等於20,但是使用trie這種資料結構,查詢每個條目的時間複雜度,和一共有多少個條目無關!時間複雜度為o w w為被...