如何实现搜索引擎的搜索关键词提示功能?
Trie树,字典树。是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。
字典树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。
其中,根节点不包含任何信息。每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串
package day0623; /** * 字典树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起 * 如果要在一组字符串中,频繁地查询某些字符串,用Trie树会非常高效 * 构建Trie树的过程,需要扫描所有的字符串,时间复杂度是O(n) * 查询时间复杂度O(k),k是要查找的字符串的长度*/ 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树中查找一个字符串 // 查找的时候可以通过字符的ASCII码减去‘a’的ASCII码,迅速找到匹配的子节点的指针 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 } //假设字符串中只有从a到z这26个小写字母,下标为0的位置存储指向子节点a的指针,依次类推 public class TrieNode { public char data; public TrieNode[] children = new TrieNode[26]; public boolean isEndingChar = false; public TrieNode(char data) { this.data = data; } } }