算法疑难(js实现)---11、字典树

算法疑难(js实现)---11、字典树

一、总结

一句话总结:

本题字典树的的操作就是1、把单词插入到字典树里面去和2、在字典树中查找单词,都是递归,分析好思路,代码很好敲
function TrieNode(val){
    this.val=val;
    this.children=[];
    this.count=0;//标记,表示单词是否出现
}

//1、把单词插入到字典树里面去
function insert(root,str){
    //递归的终止条件:把单词所有的字符插完(打标记的操作)
    //递归的递推表达式:父节点到子节点,单词的首字母就被用掉了
    //递归的返回值:不需要

    if(str[0]!==undefined){
        //去跟节点下面去找这个单词的第一个字符是否出现,
        //如果没出现,就创建,然后走这条路,
        //如果出现了,就直接走这条路
        if(root.children[str[0]]===undefined){
            root.children[str[0]]=new TrieNode(str[0]);
        }
        insert(root.children[str[0]],str.slice(1));
    }else{
        root.count++;
    }
}
let root=new TrieNode('');
insert(root,'and');
insert(root,'about');
insert(root,'as');
insert(root,'boy');
insert(root,'by');
insert(root,'because');
insert(root,'as');
console.log(root);

//2、在字典树中查找单词
function find(root,str){
    //递归的终止条件:在子节点中没找到 或者 单词找完
    //递归的递推表达式:父节点到子节点,单词的首字母就被用掉了
    //递归的返回值:true或者false
    if(str[0]!==undefined){
        if(root.children[str[0]]===undefined) return false;
        else return find(root.children[str[0]],str.slice(1));
    }else{
        if(root.count>=1) return true;
        else return false;
    }
    //查找单词的第一个字符是否在根节点的子节点中,如果出现了,就接着往下找
    //如果没出现,直接return false
    //在单词找完后,如果标记大于1,表示单词出现过,就return true,
    //否则return false
}
console.log(find(root,'close'));//false
console.log(find(root,'an'));//false
console.log(find(root,'as'));//true
console.log(find(root,'boy'));//true

1、字典树是什么?

字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

2、字典树优点?

字典树利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

3、字典树的作用?

统计,排序和保存大量的字符串

4、字典树的特点?

1、【节点存储字符】:字典树的节点存储的是单词的字符(字母)
2、【单词尾字符加标记】:为了表示一个单词是否出现,我们可以给单词的最后的字符加上标记
3、【链表示单词】:字典树中表示一个单词用的是一条链

二、字典树

博客对应课程的视频位置:11、字典树
https://www.fanrenyi.com/video/20/247

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>字典树</title>
  6 </head>
  7 <body>
  8 <!--
  9 需求:
 10 创建一个字典树,在字典树中查找是否包含某个单词
 11 
 12 单词序列:
 13 and
 14 about
 15 as
 16 boy
 17 by
 18 because
 19 as
 20 
 21 查找:
 22 close   false
 23 an   false
 24 as   true
 25 boy  true
 26 
 27 字典树是什么
 28 字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
 29 
 30 字典树的作用
 31 统计,排序和保存大量的字符串
 32 
 33 字典树的特点
 34 1、字典树的节点存储的是单词的字符(字母)
 35 2、为了表示一个单词是否出现,我们可以给单词的最后的字符加上标记
 36 3、字典树中表示一个单词用的是一条链
 37 4、字典树的根节点没有什么意义
 38 
 39 字典树的操作
 40 1、把单词插入到字典树里面去
 41 2、在字典树中查找单词
 42 
 43 
 44 
 45 1、把单词插入到字典树里面去
 46 算法步骤:
 47 去跟节点下面去找这个单词的第一个字符是否出现,
 48 如果没出现,就创建,然后走这条路,
 49 如果出现了,就直接走这条路
 50 (在这个过程里面,单词的第一个字符就被消耗掉了)
 51 
 52 算法:
 53 递归
 54 
 55 
 56 2、在字典树中查找单词
 57 算法:
 58 递归
 59 
 60 算法步骤:
 61 查找单词的第一个字符是否在根节点的子节点中,如果出现了,就接着往下找
 62 如果没出现,直接return false
 63 在单词找完后,如果标记大于1,表示单词出现过,就return true,
 64 否则return false
 65 
 66 
 67 -->
 68 <script>
 69     function TrieNode(val){
 70         this.val=val;
 71         this.children=[];
 72         this.count=0;//标记,表示单词是否出现
 73     }
 74 
 75     //1、把单词插入到字典树里面去
 76     function insert(root,str){
 77         //递归的终止条件:把单词所有的字符插完(打标记的操作)
 78         //递归的递推表达式:父节点到子节点,单词的首字母就被用掉了
 79         //递归的返回值:不需要
 80 
 81         if(str[0]!==undefined){
 82             //去跟节点下面去找这个单词的第一个字符是否出现,
 83             //如果没出现,就创建,然后走这条路,
 84             //如果出现了,就直接走这条路
 85             if(root.children[str[0]]===undefined){
 86                 root.children[str[0]]=new TrieNode(str[0]);
 87             }
 88             insert(root.children[str[0]],str.slice(1));
 89         }else{
 90             root.count++;
 91         }
 92     }
 93     let root=new TrieNode('');
 94     insert(root,'and');
 95     insert(root,'about');
 96     insert(root,'as');
 97     insert(root,'boy');
 98     insert(root,'by');
 99     insert(root,'because');
100     insert(root,'as');
101     console.log(root);
102 
103     //2、在字典树中查找单词
104     function find(root,str){
105         //递归的终止条件:在子节点中没找到 或者 单词找完
106         //递归的递推表达式:父节点到子节点,单词的首字母就被用掉了
107         //递归的返回值:true或者false
108         if(str[0]!==undefined){
109             if(root.children[str[0]]===undefined) return false;
110             else return find(root.children[str[0]],str.slice(1));
111         }else{
112             if(root.count>=1) return true;
113             else return false;
114         }
115         //查找单词的第一个字符是否在根节点的子节点中,如果出现了,就接着往下找
116         //如果没出现,直接return false
117         //在单词找完后,如果标记大于1,表示单词出现过,就return true,
118         //否则return false
119     }
120     console.log(find(root,'close'));//false
121     console.log(find(root,'an'));//false
122     console.log(find(root,'as'));//true
123     console.log(find(root,'boy'));//true
124 </script>
125 </body>
126 </html>

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/12952741.html