首页 > 其他分享 >【字典树】【TRIE】

【字典树】【TRIE】

时间:2024-05-16 20:30:35浏览次数:20  
标签:hash Trie TRIE int nex 字符串 节点 字典

本质

最多有二十六个节点的树(假设只看小写英文字母)。空间换时间
nex[p]是一个节点,根据c的取值最多有26个分支,nex[p][c]存的是下一个节点
image

有意思的情况:
为什么Trie的树用数组实现,二叉树用指针实现:

当创建和使用Trie树时,以下是一般的步骤和操作:

  • 创建Trie树的节点结构:通常使用一个结构体或类来表示Trie树的节点。这个结构体或类包含一个数组或指针,用于存储子节点的引用或索引,以及其他必要的字段(例如,表示是否是一个字符串的终节点)。
  • 插入字符串:要插入一个字符串到Trie树中,需要从根节点开始,逐个字符遍历字符串。对于每个字符,检查是否在当前节点的子节点中存在相应的边。若存在,则移动到对应的子节点;若不存在,则创建一个新的子节点,并移动到该子节点。重复这个过程,直到遍历完整个字符串。最后,将最后一个节点标记为字符串的终节点。
  • 搜索字符串:要搜索一个字符串是否在Trie树中存在,同样需要从根节点开始,逐个字符遍历目标字符串。对于每个字符,检查当前节点的子节点是否存在相应的边。若存在,则移动到对应的子节点;若不存在,则说明目标字符串不在Trie树中。如果遍历完目标字符串的所有字符,最后一个节点标记为字符串的终节点,则说明目标字符串存在于Trie树中。
  • 删除字符串:要删除一个字符串,可以先执行搜索操作以确保字符串存在于Trie树中。然后,从最后一个节点开始,逐步向上回溯,删除沿途节点和边。如果删除一个节点后,其父节点不再拥有其他子节点且未标记为终节点,则可以进一步删除该父节点。重复这个过程,直到回溯到根节点或遇到一个终节点。
  • 应用扩展:Trie树还可以扩展用于其他应用,如前缀匹配、自动补全、字典检索等。这些应用可以基于Trie树的结构和特性进行设计和实现。

如果闲着没事干,可以研究一下压缩Trie


OI Wiki TRIE实现

struct trie {
  int nex[100000][26], cnt;
  bool exist[100000];  // 该结点结尾的字符串是否存在

  void insert(char *s, int l) {  // 插入字符串
    int p = 0;
    for (int i = 0; i < l; i++) {
      int c = s[i] - 'a';
      if (!nex[p][c]) nex[p][c] = ++cnt;  // 如果没有,就添加结点
      p = nex[p][c];
    }
    exist[p] = 1;
  }

  bool find(char *s, int l) {  // 查找字符串
    int p = 0;
    for (int i = 0; i < l; i++) {
      int c = s[i] - 'a';
      if (!nex[p][c]) return 0;
      p = nex[p][c];
    }
    return exist[p];
  }
};

Trie树的应用场景

Trie最典型的应用场景是用于搜索引擎的suggest功能,比如我们在google中,每输入一个英文字母,搜索引擎都会给过我们返回以这个字母为前缀的相关的结果,如下:
image

Hash和Trie的比较:

作者:Yingjun Wu
链接:https://www.zhihu.com/question/27168319/answer/337652473
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先一个问题就是这是静态的数据集还是动态的数据集?也就是说是否用户可以插入新的字符串到这个现有的字符串集合中?如果是静态的数据集,那么用hash吧。数据集大小固定,用perfect hashing或者cuckoohashing可以达到collision概率最小,构建完hash table之后对给定字符串进行查询几乎肯定是一次搞定。然而如果是个动态的数据集,而且新的字符串被不断的插入呢?这个时候用perfect/cuckoo hashing就不合适了。这是因为perfect/cuckoo hashing的一个假设是workload size是提前预知的,在这种假设前提下才能开出足够的空间在设定好hash function的情况下达到collision最小。然而当有大量插入时,perfect/cuckoo hash table的性能就变得不稳定了,因为每次insert都可能需要多次调整内部数据存放的位置。为了降低collision,只能增大hash table,然而resize是perfect/cuckoo hashing最不擅长的,因为必须重新构建hash table,性能非常之差。这时的解决方法是考虑extentiable hashing或者linear hashing。这两种hash table能够很好的动态改变数据结构大小。当然相比于perfect/cuckoo hashing,collision也会相对较多,同时也会带来linear probing的代价。

标签:hash,Trie,TRIE,int,nex,字符串,节点,字典
From: https://www.cnblogs.com/peterzh/p/18196687

相关文章

  • 简易首页防暴力-字典计时器
        有时候首页需要限制下相同账号的错误登录次数,防止暴力破解,实际而言,还是有一点点作用,虽然并不是很大,一定层度上也能扼杀一番,主要是调整起来方便,对于老旧系统改造起来比较快,核心是字典,一个记录失败次数,一个记录账号解锁的时间,在账号登录时先去字典里面校验,不用频繁的请求......
  • Python中如何避免字典和元组的多重嵌套的方法
    一、字典、元组的多重嵌套例1:记录全班学生的成绩。分析:定义一个SimpleGradebook类,学生名是字典self._grades的键,成绩是字典self._grades的值。classSimpleGradebook():def__init__(self):self._grades={}defadd_student(self,name):self.......
  • 字符串、列表、字典内置方法
    字符串内置方法【一】字符串的查找字符串内部的字符默认从左向右找,并返回当前字符在串中的索引坐标【1】find方法name='qwerooehjkl'print(name.find('e'))默认只找一次,找到就不找了#2第二个e不找了可以指定寻找的区间,参数不带''引号从第三个到最后一个pr......
  • dbeaver连接mysql报错Public Key Retrieval is not allowed
    这个错误通常发生在尝试通过JDBC连接MySQL数据库时,并且是由于MySQL的配置不允许公钥检索导致的。从MySQL5.0开始,连接时默认需要使用密钥进行密码加密传输。如果JDBC驱动程序尝试通过不允许公钥检索的方式进行连接,就会抛出这个错误。解决方法:更新JDBC连接字符串,添加允许公钥检......
  • ABC353E字典树处理最长公共前缀
    https://atcoder.jp/contests/abc353/tasks/abc353_e其实就是字典树板子题。似乎遇到最长公共前缀,就该想到字典树。依次加入每个字符串:维护一个数组siz来统计在当前串之前的串在对应点的出现次数。手模一下字典树的建树过程,显然如果当前串\(S_i\)能跑到一个曾经串\(S_......
  • #Trie#洛谷 6018 [Ynoi2010] Fusion tree
    题目给定一棵树,树上每个节点都有点权,需要实现三种操作,第一种是将与\(x\)相邻的所有节点点权加一,第二种是单点减小点权,第三种是查询与\(x\)相邻的所有节点点权的异或和分析相邻实际上就是父节点和子节点,不妨将其拆开考虑,需要解决单点查询单点修改的问题,考虑维护\(n\)......
  • Python-有序字典OrderedDict练习题
    问题:读取键盘输入结果,创建n个键值对,将其排序后放入有序字典并输出。详细描述:根据提示,实现函数功能:读取n(n>0)行输入,以每一行的数据为key,行号(从0开始)为value,建立n对键值对,然后将他们按照key排序后,放入一个有序字典,最后输出这个有序字典。importcollectionsdefFunc():pairs......
  • ERROR: CUDA out of memory. Tried to allocate 254.00 MiB.
    正在将samples/llm/大模型技术栈-算法与原理.md添加到向量库,共包含30条文档Batches:0%||0/1[00:00<?,?it/s]2024-05-1010:21:36,963-embeddings_api.py[li......
  • 一篇文章掌握Python中多种表达式的使用:算术表达式、字符串表达式、列表推导式、字典推
    Python中的表达式可以包含各种元素,如变量、常量、运算符、函数调用等。以下是Python表达式的一些分类及其详细例子:1.算术表达式算术表达式涉及基本的数学运算,如加、减、乘、除等。#加法表达式sum=3+5#结果为8#乘法表达式product=4*6#结果为24#复......
  • P4407 [JSOI2009] 电子字典
    题目链接:https://www.luogu.com.cn/problem/P4407trie树+爆搜做法:对所有文本串建树。对于编辑距离要求的三种情况,分四类在trie树上爆搜即可。#definemaxn200010structtrie{intson[maxn][26];intcnt[maxn];intidx=0;map<string,bool>mm;intv......