详解Java前缀树(Trie)的原理及代码实现,下面是完整攻略:
1. 前缀树(Trie)的原理
前缀树,又叫字典树,是一种以树形结构来存储查询词条或单词的查找树。它的根节点不包含字符,每一个代表字符串中一个字符的节点内包含一个字符,从根节点到某一个节点的路径上经过的字符串连接起来即为该节点表示的字符串。
前缀树的查询通常是从根节点开始,根据查询词的字符在树中查找对应的节点,最后根据查询词是否全部匹配来确定是否找到结果。这种查找方式相较于哈希表或二叉树查找更为高效。
下面是前缀树的基本结构:
class TrieNode {
Map<Character, TrieNode> children = new HashMap<>();
boolean isEndOfWord = false;
}
其中,children
是一个 Map
,用来存储子节点,isEndOfWord
表示该节点是否为一个字符串的结尾。
2. 前缀树(Trie)的代码实现
下面是前缀树的代码实现:
class Trie {
TrieNode root = new TrieNode();
/** 插入一个字符串 */
public void insert(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
node.children.putIfAbsent(c, new TrieNode());
node = node.children.get(c);
}
node.isEndOfWord = true;
}
/** 是否包含某个字符串 */
public boolean search(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
node = node.children.get(c);
if (node == null) {
return false;
}
}
return node.isEndOfWord;
}
/** 是否有以某个前缀开头的字符串 */
public boolean startsWith(String prefix) {
TrieNode node = root;
for (char c : prefix.toCharArray()) {
node = node.children.get(c);
if (node == null) {
return false;
}
}
return true;
}
}
以上代码的 Trie
类中,root
指向根节点,insert()
方法用于向前缀树插入一个字符串,search()
方法用于查找某个字符串是否存在于前缀树中,startsWith()
方法则用于判断是否存在以某个前缀开头的字符串。
3. 示例说明
示例一:查找单词
假如我们有一个英文字典,在其中查找某个单词是否存在,这时我们可以使用前缀树。
示例代码:
Trie trie = new Trie();
trie.insert("hello");
trie.insert("world");
System.out.println(trie.search("world")); // 输出 true
System.out.println(trie.search("hi")); // 输出 false
以上代码中,我们先将单词 "hello" 和 "world" 插入到前缀树中,然后分别查找单词 "world" 和 "hi" 是否存在于前缀树中。其中,"world" 存在于前缀树中,而 "hi" 则未找到。
示例二:前缀匹配
假如我们要在一个字符串集合中搜索所有以 "ab" 开头的字符串,这时候我们可以使用前缀树。
示例代码:
Trie trie = new Trie();
trie.insert("abcd");
trie.insert("abce");
trie.insert("abcd123");
trie.insert("abbce");
trie.insert("dabcdef");
for (String s : new String[]{"ab", "abc"}) {
System.out.println("以" + s + "开头的字符串有:");
for (String word : strs) {
if (word.startsWith(s)) {
System.out.println(word);
}
}
System.out.println("——使用前缀树查找——");
for (String word : trie.findWordsByPrefix(s)) {
System.out.println(word);
}
}
以上代码中,我们先将字符串集合 {"abcd", "abce", "abcd123", "abbce", "dabcdef"} 插入到前缀树中,然后分别使用普通的字符串匹配和前缀树来查找以 "ab" 和 "abc" 开头的字符串。其中,"ab" 开头的字符串有 "abcd", "abce" 和 "abbce","abc" 开头的字符串有 "abcd" 和 "abce",通过前缀树可以快速地找到这些字符串。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java前缀树Trie的原理及代码实现 - Python技术站