首页 > 其他分享 >字典树

字典树

时间:2022-11-24 18:56:15浏览次数:61  
标签:字符 int next cdot 字符串 字典


如上图

  1. 根节点什么都不存
  2. 其余结点存各自对应的一个字符
  3. 从根节点往下遍历,遍历的字符组成了存储的字符串

建树

\(next[i][c]\)表示字符串与之对应的(\(s[j]=c\))下一个字符(\(s[j+1]\))存储的位置,idx用来给新的字符开辟新的空间

int next[MAX_N * 50][26], idx;

补:
inline int get_num(char ch) { return ch - 'a'; }

插入字符串

\(c=get_num(s[i])\)代表获取字符\(s[i]\)的ASCII码,\(next[p][c]\)代表下一个字符在next中的位置,这个\(for\)循环是用来迭代字符串\(s\)的,而\(p=next[p][c]\)是用来迭代字典树的。如果\(next[p][c]\)为\(0\)(初始值是\(0\)),那么说明这个字符在字典树这个位置第一次出现给它开辟一个新的空间

inline void insert(const char* s) noexcept {
  int p = 0, c;
  for (int i = 0; s[i] != '\0'; ++i) {
    c = get_num(s[i]);
    if (!next[p][c]) next[p][c] = ++idx;
    p = next[p][c];
  }
  exit[p] = true;
}

查找字符串

与插入原理相同,当\(next[p][c]\)为0说明在字典树中以\(s[0]->s[i-1]\)为前缀的子串第一次出现\(s[i]\),说明没找到。

inline int find(const char* s) {
  int p = 0;
  for (int i = 0; s[i] != '\0'; ++i) {
    int cn = get_num(s[i]);
    if (!next[p][cn]) return 0;
    p = next[p][cn];
  }
  //找到了,返回需要的东西
}

记录字符串第一次出现的索引

声明一个变量数组\(cnts[MAXN]\)每当第一次插入的时候使其值\(+1\)

记录字符串重复的次数

当遍历到\(s[i]=='\0'\)是如果\(idx\)没变让\(++cnts[p]\)

字典树数组开辟空间的大小


字典树的深度(高度)与所包含的字符串前缀的相似度有关,设每层的结点数目为$x$个,设字符串的长度最多$m$,共$n$个字符串。那么第一层就是一个,第二层为$x^2$,第三层为$x^3$·····依次类推那么,前缀相同且长度为$k$时,字典树所含有的结点的个数为$\sum^{k}_{i=0}{x^i}+(m-k)\cdot{n}$。其中$(m-k)\cdot{n}$为前缀不同剩余得结点数量的最大值,显然一般是比这个小的。以上公式前面是一个等比级数 ,得:

\(\frac{w^{k+1}-1}{w-1} + (m-k)\cdot{n} = (1-k)\cdot{n}+n\cdot{m} \leq m\cdot{n}\)。

题目

1
2
3

标签:字符,int,next,cdot,字符串,字典
From: https://www.cnblogs.com/GuanStudy/p/16922856.html

相关文章

  • 【Java】将枚举类转换为Redis字典缓存
     字典翻译框架实现看这篇:https://www.cnblogs.com/mindzone/p/16890632.html枚举的特性首先是枚举的一些特性:1、枚举实例直接在枚举类中声明2、重载构造器,......
  • kotlin类似javalist map所谓c shape 或ios那边的字典的遍历循环和创建以及泛型
    println("testlengthfunc:${getObjectLength("Howlongdoihave,please?")}");//geLength会出现会重写的情况,应该是自动倒入了某些系统的类导致的。varlist=li......
  • 字典
    一.初始字典why:目前已经学习了容器型数据类型有list和tuple,list够用吗,有什么缺点   1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢   2.......
  • 212. 单词搜索 II(字典树/前缀树)
    给定一个 mxn 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻......
  • Dict - 字典/hash
    哈希表结构定义typedefstructdictht{//哈希表数组dictEntry**table;//哈希表大小unsignedlongsize;//哈希表大小掩码,用于计算索引值/......
  • LC[386] 字典序排数
    https://leetcode.cn/problems/lexicographical-numbers/description/想像成一颗树的遍历AC代码:classSolution{public:vector<int>lexicalOrder(intn){......
  • 五分钟拿捏Python字典-Python3入门必备[字典详细操作]
    介绍在上一篇文章《​​Python3详细的数组基础操作-入门必备[列表的操作]​​》中讲解了Python的列表操作,这次接着唠唠Python数组中的字典,字典是Python的另一种可变容器......
  • 10python字典
    列表和字典的区别是列表可以通过索引来访问值,而字典可以通过名称来访问各个值。字典这种数据结构称为映射(mapping),字典是Python中唯一内置映射类型,值不按照顺序排列,而是......
  • 【Python】字典dict_相同key,不同value的添加方法
     dict.setdefault(key,[]).append(value) #coding:utf-8fromloguruimportloggeraslogsclassdemo:defrun(self):new_dict={}#......
  • MAUI新生1.5-XAML语法基础:资源字典ResourceDictionary
    每个派生自VisualElement或Application的对象,都有一个Resources属性,属性值为Dictionary<string,object>类型的集合对象,这些集合对象可作为资源,提供给元素及其在控件树中的......