# 算法中Trie怎么實現
## 一、Trie樹的基本概念
Trie樹(發音同"try"),又稱前綴樹或字典樹,是一種樹形數據結構,用于高效地存儲和檢索字符串集合中的鍵。其核心特點是利用字符串的公共前綴來減少查詢時間,典型應用包括:
- 搜索引擎的自動補全功能
- 拼寫檢查系統
- IP路由表查找
- 輸入法候選詞預測
### 1.1 Trie的特性
1. **前綴共享**:具有相同前綴的字符串會共享相同的節點路徑
2. **多叉結構**:每個節點最多有字母表大小的子節點(英語通常26個)
3. **確定性**:從根節點到任意節點的路徑唯一確定一個字符串
## 二、Trie的基本實現
### 2.1 節點結構設計
```python
class TrieNode:
def __init__(self):
self.children = {} # 字符到子節點的映射
self.is_end = False # 標記是否為單詞結尾
def insert(self, word: str) -> None:
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end = True
時間復雜度:O(L),其中L為單詞長度
def search(self, word: str) -> bool:
node = self.root
for char in word:
if char not in node.children:
return False
node = node.children[char]
return node.is_end
def startsWith(self, prefix: str) -> bool:
node = self.root
for char in prefix:
if char not in node.children:
return False
node = node.children[char]
return True
class RadixNode:
def __init__(self):
self.children = {} # 鍵為字符串片段
self.is_end = False
優勢: - 合并單一路徑節點 - 減少內存使用 - 提高查詢效率
使用兩個數組base和check實現:
struct DoubleArrayTrie {
int base[SIZE];
int check[SIZE];
};
特點: - 極致空間優化 - 適合大規模靜態字典 - 實現復雜度較高
def get_suggestions(node, prefix, suggestions):
if node.is_end:
suggestions.append(prefix)
for char, child in node.children.items():
get_suggestions(child, prefix+char, suggestions)
class TrieNode:
def __init__(self):
self.children = {}
self.count = 0 # 增加計數功能
操作 | Trie | 哈希表 | 平衡二叉搜索樹 |
---|---|---|---|
插入 | O(L) | O(1)* | O(log n) |
查找 | O(L) | O(1) | O(log n) |
前綴查找 | O(L) | 不支持 | 不支持 |
(* 假設無哈希沖突)
class TrieNode {
private TrieNode[] children = new TrieNode[26];
private boolean isEnd;
}
struct TrieNode {
unordered_map<char, TrieNode*> children;
bool isEnd;
~TrieNode() { // 需要手動釋放內存
for(auto& pair : children)
delete pair.second;
}
};
字符處理:
內存優化:
# 使用數組替代字典(當字符集固定時)
self.children = [None] * 26
持久化存儲:
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end = True
def search(self, word):
node = self.root
for char in word:
if char not in node.children:
return False
node = node.children[char]
return node.is_end
def startsWith(self, prefix):
node = self.root
for char in prefix:
if char not in node.children:
return False
node = node.children[char]
return True
def delete(self, word):
def _delete(node, word, index):
if index == len(word):
if not node.is_end:
return False
node.is_end = False
return len(node.children) == 0
char = word[index]
if char not in node.children:
return False
should_delete = _delete(node.children[char], word, index+1)
if should_delete:
del node.children[char]
return len(node.children) == 0 and not node.is_end
return False
_delete(self.root, word, 0)
Trie樹作為字符串處理的高效數據結構,在特定場景下展現出顯著優勢。實際應用中需要根據具體需求選擇標準實現或優化變種,并注意處理邊界條件和性能瓶頸。掌握Trie的實現不僅有助于解決字符串相關問題,也是理解更復雜數據結構的基礎。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。