字首樹:trie樹,又稱字典樹、字首樹,是一種樹形結構,是雜湊樹的變種,是一種用於快速檢索的多叉樹結構。
典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。
trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。
trie樹也有它的缺點,trie樹的記憶體消耗非常大。
怎麼樣建立乙個字首樹?首先我們定義乙個字串『abc』 ,那麼它是怎麼建立的呢
我們再新增乙個字串『bce』,在樹上怎麼新增呢,會在這棵樹上看頭結點的下面乙個有沒有是以b開頭的,沒有就開過一條路,有就直接拿來復用。
真正的用處:
我們可以在每個節點新增兩個資料項,乙個end表示字串是以這個節點為結尾的,乙個path表示這個節點被經過多少次。字首樹一般用於字串的增刪改查等這些功能。
**:
public
class
code_01_trietree
}public
static
class
trie
//插入字串
public
void
insert
(string word)
char
chs = word.
tochararray()
;//把字串轉換為陣列
trienode node = root;
int index =0;
for(
int i =
0; i < chs.length; i++
) node = node.nexts[index]
;//跳到下面的那個節點依次檢視
node.path++
;//經過的次數+1
} node.end++
;//一直到最後那個,end+1
}//刪除這個字串
public
void
delete
(string word)
node = node.nexts[index];}
node.end--;}
}//查詢是否有這個字串
public
intsearch
(string word)
char
chs = word.
tochararray()
; trienode node = root;
int index =0;
for(
int i =
0; i < chs.length; i++
) node = node.nexts[index];}
return node.end;
}//查詢有多少是以這個字串為字首的
public
intprefixnumber
(string pre)
char
chs = pre.
tochararray()
; trienode node = root;
int index =0;
for(
int i =
0; i < chs.length; i++
) node = node.nexts[index];}
return node.path;}}
public
static
void
main
(string[
] args)
}
**裡面的方法解析:
插入和查詢就不細說了,可以看**的註解。重點說一下這裡面的刪除操作。刪除操作裡面有乙個情況。
例如我要刪除字串kgftw,這裡面當我遍歷到f的時候我們會發現這裡的path已經為0了 ,所以我們 可以直接把後面的那些刪除。
查詢有多少是以這個字串為字首的思想,一樣我們遍歷到這個字串的最後乙個字元,看它的path就可以知道它被當成了多少次字首。
字串 字首樹 字典樹 Trie樹的實現
關鍵點 1 節點類的構建,通過乙個陣列記錄下乙個節點及路徑 2 注意path 0 end 0的含義 字典樹 字首樹的實現 是一種樹形結構,優點是利用字串的公共字首來節約儲存空間 class trienode class trie 新增word,可重複新增 public void insert str...
字串的使用(1)
1 字串定義 用單引號或者雙引號括起來的任意字串行 2 字串的特點 有序集合型別 支援索引訪問 不可變資料型別,元素不能直接修改 3 str a str 11,22 組成 普通字元,特殊字元 轉義字元 n 4 字串的運算 str index 索引訪問,但不能修改 str start end 切片 o...
Python 字串字首
該部落格主要記錄下python字串的字首,讓後續的使用更加方便 後面字串以 unicode 格式 進行編碼,一般用在中文字串前面,防止因為原始碼儲存格式問題,導致再次使用時出現亂碼。作用 去掉反斜槓的轉移機制。特殊字元 即那些,反斜槓加上對應字母,表示對應的特殊含義的,比如最常見的 n 表示換行,t...