字典树
如上图
- 根节点什么都不存
- 其余结点存各自对应的一个字符
- 从根节点往下遍历,遍历的字符组成了存储的字符串
建树
表示字符串与之对应的()下一个字符()存储的位置,idx用来给新的字符开辟新的空间
int next[MAX_N * 50][26], idx;
补:
inline int getnum(char ch) { return ch - 'a'; }
插入字符串
代表获取字符的ASCII码,代表下一个字符在next中的位置,这个循环是用来迭代字符串的,而是用来迭代字典树的。如果为(初始值是),那么说明这个字符在字典树这个位置第一次出现给它开辟一个新的空间
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; }
查找字符串
与插入原理相同,当为0说明在字典树中以为前缀的子串第一次出现,说明没找到。
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]; } //找到了,返回需要的东西 }
记录字符串第一次出现的索引
声明一个变量数组每当第一次插入的时候使其值
记录字符串重复的次数
当遍历到是如果没变让
字典树数组开辟空间的大小
字典树的深度(高度)与所包含的字符串前缀的相似度有关,设每层的结点数目为个,设字符串的长度最多,共个字符串。那么第一层就是一个,第二层为,第三层为·····依次类推那么,前缀相同且长度为时,字典树所含有的结点的个数为。其中为前缀不同剩余得结点数量的最大值,显然一般是比这个小的。以上公式前面是一个等比级数 ,得:
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律