它是一種專門處理字符串匹配的數據結構,用來解決在一組字符串集合中快速查找某個字符串的問題。bash
它的本質,就是利用字符串之間的公共前綴,將重複的前綴合並在一塊兒。數據結構
如如下6個字符串:how、hi、her、hello、so、seeui
其中,根節點不包含任何信息。每一個節點表示一個字符串中的字符,從根節點到紅色節點(不必定都是葉子節點)的一條路徑表示一個字符串。this
Trie樹的構造過程:構造的每一步,都至關於往Trie樹中插入一個字符串。當全部字符串都插入完成後,Trie樹就構造好了。搜索引擎
public class Trie {
private TrieNode root = new TrieNode('/'); // 存儲無心義字符
// 往 Trie 樹中插入一個字符串
public void insert(char[] text) {
TrieNode p = root;
for (int i = 0; i < text.length; ++i) {
int index = text[i] - 'a';
if (p.children[index] == null) {
TrieNode newNode = new TrieNode(text[i]);
p.children[index] = newNode;
}
p = p.children[index];
}
p.isEndingChar = true;
}
// 在 Trie 樹中查找一個字符串
public boolean find(char[] pattern) {
TrieNode p = root;
for (int i = 0; i < pattern.length; ++i) {
int index = pattern[i] - 'a';
if (p.children[index] == null) {
return false; // 不存在 pattern
}
p = p.children[index];
}
if (p.isEndingChar == false) return false; // 不能徹底匹配,只是前綴
else return true; // 找到 pattern
}
public class TrieNode {
public char data;
public TrieNode[] children = new TrieNode[26];
public boolean isEndingChar = false;
public TrieNode(char data) {
this.data = data;
}
}
}
複製代碼
插入時間複雜度O(n)(n表示全部字符串的長度和)。spa
查找時間複雜度O(k)(k表示要查找的字符串的長度)。3d
以上的數據結構形成空間複雜度很大。code