首页 > 编程语言 >字典树(trie) 算法笔记

字典树(trie) 算法笔记

时间:2023-07-19 12:33:59浏览次数:40  
标签:int trie 单词 ++ 算法 nex 节点 字典

P1 字典树是什么

顾名思义就像一个字典一样,可以查询某单词是否出现,也可以查找同一前缀的单词的个数等等操作。

P2 字典树的实现

字典树是用树来实现的(这不废话吗),如果从根节点走到一个已标记过的节点(后面我们会称它为单词节点)的一条路径就是一个单词。
我们定义一下变量(或数组)的表示含义:

  • \(tot\): 表示当前一共有多少个节点。
  • \(nex[p][c]\): 表示 \(p\) 节点的走 \(c\) 这条路径的下一个节点。
  • \(exist[p]\): 表示 \(p\) 是否为单词节点。
  • \(deta[p]\): 表示 \(p\) 节点的属性(权值),这个数组可有可无(通常为经过此节点的次数)。

很快我们就可以写出插入字符串,和查询字符串是否存在的代码,代码如下:

void insert(string s, int p = 0) {
  for (int i = 0, c; i < s.size(); i++) {
    c = ToId(s[i]);                      // ToId为字符转整数的函数
    !nex[p][c] && (nex[p][c] = ++tot);   // 若没有此节点,开辟新节点
    p = nex[p][c] /*往下走*/, cnt[p]++;  // 此处cnt为上述的deta,为经过此节点的次数
  }
  exist[p] = 1;  // 将此节点标记为但此节点
}
bool query(string s, int p = 0) {
  for (int i = 0, c; i < s.size(); i++) {
    c = ToId(s[i]);
    if (!nex[p][c]) {
      return 0;
    }               // 没有路了没有此单词
    p = nex[p][c];  // 往下走
  }
  return exist[p];
}  // query的含义可以改变,此处是查询此字符串是否存在

很容易发现这个数据结构是一个用空间来换时间的数据结构,空间复杂度为:\(O(nmt)\),\(n\) 表示单词的个数,\(m\) 表示单词的长度,\(t\) 表示字符的种类数。

标签:int,trie,单词,++,算法,nex,节点,字典
From: https://www.cnblogs.com/lrx-blogs/p/Dictionary-Tree-Algorithm-Notes.html

相关文章

  • 代码随想录算法训练营第三十三天| 1049. 最后一块石头的重量 II 494. 目标和 474.一
    1049.最后一块石头的重量II思路:因为含有两个石头的相撞,所以需要把dp的目标值改成sum/2,然后取得这个目标值的最大值,然后对sum-2*target代码:1//要求:有多个石头,两两撞击,取得剩下的石头的最小值2//——》一定要碰到最后一个3//注意:4//1,x==y:两个粉碎,x<y:y=......
  • 取字典中最大最小值对应的键
    取字典中最大最小值对应的键#取最大值对应的键tmp_dict={"a":1,"b":3,"c":9,"d":13}max_key=max(tmp_dict,key=lambdax:tmp_dict[x])print(f"maxkey:{max_key}")#取对小值对应的键tmp_di......
  • m基于虚拟力优化算法的二维室内红外传感器部署策略matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要        红外传感器在室内环境监测、安防、智能控制等领域中得到了广泛应用。在室内部署红外传感器时,其位置的选择对于传感器的性能和信号质量有着至关重要的影响。因此,如何确定红外传感器......
  • 代码随想录算法训练营第57天 | ● 647. 回文子串 ● 516.最长回文子序列 ● 动
     第九章 动态规划part17●  647. 回文子串  ●  516.最长回文子序列●  动态规划总结篇 今天 我们就要结束动态规划章节了,大家激不激动!!!   详细布置   647. 回文子串    动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。https:......
  • 代码随想录算法训练营第58天 | ● 739. 每日温度 ● 496.下一个更大元素 I - 第1
     第十章 单调栈part01 ●  739. 每日温度 ●  496.下一个更大元素 I    详细布置    739. 每日温度  今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。 大家可以读题,思考暴力的解法,然后在看单调栈的解法。 就能感受出单调栈的巧妙 ......
  • 代码随想录算法训练营第59天 | ● 503.下一个更大元素II ● 42. 接雨水 - 第10章
     第十章 单调栈part02 ●  503.下一个更大元素II ●  42. 接雨水    详细布置   503.下一个更大元素II  这道题和 739. 每日温度 几乎如出一辙,可以自己尝试做一做 https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%......
  • 代码随想录算法训练营第60天 | ● 84.柱状图中最大的矩形 - 第10章 动态规划part03
     第十章 单调栈part03有了之前单调栈的铺垫,这道题目就不难了。  ●  84.柱状图中最大的矩形   今天是训练营最后一天,恭喜坚持两个月的录友们,接下来可以写一篇自己 代码随想录一刷的总结。好好回顾一下,这两个月自己的博客内容,以及自己的收获。  ......
  • 二分图相关算法模板
    二分图判定概念解释二分图:设$G=(V,E)$是一个无向图,如果顶点$V$可分割为两个互不相交的子集$(A,B)$,并且图中的每条边$(i,j)$所关联的两个顶点$i$和$j$分别属于这两个不同的顶点集$(i\inA,j\inB)$,则称图$G$为一个二分图相关性质定理一个图是二分图$\Leftrightarrow$图中不......
  • 《C++》拷贝和替换算法
    copy复制容器元素到新容器 vector<int>v3; v3.resize(v1.size()); copy(v1.begin(),v1.end(),v3.begin());replace元素值替换 replace(v3.begin(),v3.end(),0,100);//replace(开始,结束,旧值,新值);replace_if条件元素值替换classFindCondition{public: booloperator()(......
  • 文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题
    文心一言VS讯飞星火VSchatgpt(62)--算法导论6.51题一、试说明HEAP-EXTRACT-MAX在堆A=(15,13,9,5,12,8,7,4,0,6,2,1)上的操作过程。文心一言:HEAP-EXTRACT-MAX是堆排序算法中的一部分,用于从堆中提取最大值并保持堆的性质。下面是在堆A=(15,13,9,5,12,8,7,4,0,6,2,1)上执行H......