当前位置:   article > 正文

Trie 字典树(前缀树)_前缀树 磁盘存储

前缀树 磁盘存储

Trie 或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

描述:向 Trie 中插入一个单词 word

实现:首先从根结点的子结点开始与 word 第一个字符进行匹配,一直匹配到前缀链上没有对应的字符,这时开始不断开辟新的结点,直到插入完 word 的最后一个字符,同时还要将最后一个结点标记一下,表示它是一个单词的末尾。

总结
通过以上介绍和代码实现我们可以总结出 Trie 的几点性质:

Trie 的形状和单词的插入或删除顺序无关,也就是说对于任意给定的一组单词,Trie 的形状都是唯一的。

 Trie 的每个结点中都保留着一个字母表,这是很耗费空间的。如果 Trie 的高度为 n,字母表的大小为 m,最坏的情况是 Trie 中还不存在前缀相同的单词,那空间复杂度就为 O(m^n)。

最后,关于 Trie 的应用场景,希望你能记住 8 个字:一次建树,多次查询。(慢慢领悟叭~~)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LuK5aScNDU2,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LuK5aScNDU2,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LuK5aScNDU2,size_20,color_FFFFFF,t_70,g_se,x_16

 五角星标记的是每个插入字符串的最后一个字母,用cnt[p]++标记;然后判断一个字符串T有多少个前缀,只需要顺着树走一遍,遇到几个五角星就说明有多少个字符串是T的前缀。

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. string str;
  5. const int N=1e5+5;
  6. int n,m;
  7. int son[N][26];
  8. int ind;
  9. int cnt[N];
  10. void ins()
  11. {
  12. int p=0;
  13. for(int i=0;i<str.size();i++)
  14. {
  15. int &s=son[p][str[i]-'a'];// &s这种写法,可以在s=++ind后,son[p][str[i]-'a']也随之变化,更加省事。
  16. if(!s)s=++ind;//trie上没有对应的字符,就开辟新的
  17. p=s;
  18. }
  19. cnt[p]++;//每个字符串最后一个字母标记一下
  20. }
  21. int query()
  22. {
  23. int res=0,p=0;
  24. for(int i=0;str[i];i++)
  25. {
  26. int &s=son[p][str[i]-'a'];
  27. if(!s)break;//trie上没有对应的字符,就结束,因为再往下也没有对应的前缀了
  28. p=s;
  29. res+=cnt[p];
  30. }
  31. return res;
  32. }
  33. int main()
  34. {
  35. cin>>n>>m;
  36. for(int i=0;i<n;i++){
  37. cin>>str;
  38. ins();
  39. }
  40. for(int i=0;i<m;i++)
  41. {
  42. cin>>str;
  43. cout<<query()<<endl;
  44. }
  45. return 0;
  46. }

注释:代码中的p意思是节点编号,root的编号是0,往下每一个节点的编号都不一样(1,2,3,.......)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/994750
推荐阅读
相关标签
  

闽ICP备14008679号