详解Java中字典树(Trie树)的图解与实现
一、什么是字典树(Trie树)
字典树,又称为Trie树,是一种树形数据结构。常用于统计和排序大量的字符串。它支持快速插入和查找,并且可以用于词频统计。
二、字典树的基本性质
- 根节点不包含字符,除根节点外每个节点都只包含一个字符。
- 从根节点到某个节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同。
三、字典树的实现
1. 节点类定义
我们首先定义一个节点类,使其包含字符和子节点数组。代码示例如下:
class TrieNode {
// 子节点数组
private TrieNode[] links;
// 数组大小
private final int R = 26;
// 节点保存的值
private boolean isEnd;
public TrieNode() {
links = new TrieNode[R];
}
public boolean containsKey(char ch) {
return links[ch - 'a'] != null;
}
public TrieNode get(char ch) {
return links[ch - 'a'];
}
public void put(char ch, TrieNode node) {
links[ch - 'a'] = node;
}
public void setEnd() {
isEnd = true;
}
public boolean isEnd() {
return isEnd;
}
}
2. 字典树类定义
在定义完节点类之后,我们需要定义字典树类,使其包含节点类,并实现插入、查找等方法。代码示例如下:
class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
// 插入字符串
public void insert(String word) {
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
char currentChar = word.charAt(i);
if (!node.containsKey(currentChar)) {
node.put(currentChar, new TrieNode());
}
node = node.get(currentChar);
}
node.setEnd();
}
// 查找字符串
public boolean search(String word) {
TrieNode node = searchPrefix(word);
return node != null && node.isEnd();
}
// 查找前缀
public boolean startsWith(String prefix) {
TrieNode node = searchPrefix(prefix);
return node != null;
}
// 判断是否有以prefix为前缀的字符串
private TrieNode searchPrefix(String word) {
TrieNode node = root;
for (int i = 0; i < word.length(); i++) {
char curLetter = word.charAt(i);
if (node.containsKey(curLetter)) {
node = node.get(curLetter);
} else {
return null;
}
}
return node;
}
}
四、字典树的实例
1. 插入字符串
我们可以使用上面定义的字典树类来插入字符串,示例代码如下:
Trie trie = new Trie();
trie.insert("apple");
2. 查找字符串
我们可以使用上面定义的字典树类来查找字符串,示例代码如下:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple") // 返回 true
trie.search("app") // 返回 false
这里 apple
存在于字典树中,而 app
不在字典树中。
3. 查找前缀
我们可以使用上面定义的字典树类来查找前缀,示例代码如下:
Trie trie = new Trie();
trie.insert("apple");
trie.startsWith("app") // 返回 true
这里 app
是 apple
的前缀,所以返回 true
。
五、总结
字典树(Trie树)是一种树形数据结构,常用于字符串的统计和排序。它具有快速插入、查找和词频统计的特点。在Java中,我们可以通过定义节点类和字典树类的方式来实现字典树。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中字典树(Trie树)的图解与实现 - Python技术站