一、定义

字典树又称单词查找树Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

image.png



字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。

二、java代码实现

  1. //字典树的java实现
  2. public class Trie {
  3. private TrieNode root;
  4. public Trie() {
  5. root = new TrieNode();
  6. root.wordEnd = false;
  7. }
  8. public void insert(String word) {
  9. TrieNode node = root;
  10. for (int i = 0; i < word.length(); i++) {
  11. Character c = new Character(word.charAt(i));
  12. if (!node.childdren.containsKey(c)) {
  13. node.childdren.put(c, new TrieNode());
  14. }
  15. node = node.childdren.get(c);
  16. }
  17. node.wordEnd = true;
  18. }
  19. public boolean search(String word) {
  20. TrieNode node = root;
  21. boolean found = true;
  22. for (int i = 0; i < word.length(); i++) {
  23. Character c = new Character(word.charAt(i));
  24. if (!node.childdren.containsKey(c)) {
  25. return false;
  26. }
  27. node = node.childdren.get(c);
  28. }
  29. return found && node.wordEnd;
  30. }
  31. public boolean startsWith(String prefix) {
  32. TrieNode node = root;
  33. boolean found = true;
  34. for (int i = 0; i < prefix.length(); i++) {
  35. Character c = new Character(prefix.charAt(i));
  36. if (!node.childdren.containsKey(c)) {
  37. return false;
  38. }
  39. node = node.childdren.get(c);
  40. }
  41. return found;
  42. }
  43. }
  44. public class TrieNode {
  45. Map<Character, TrieNode> childdren;
  46. boolean wordEnd;
  47. public TrieNode() {
  48. childdren = new HashMap<Character, TrieNode>();
  49. wordEnd = false;
  50. }
  51. }