首页 > 其他分享 >数据结构——字典树 学习笔记

数据结构——字典树 学习笔记

时间:2023-11-15 10:44:06浏览次数:39  
标签:str int pos 笔记 trie nex 数据结构 root 字典

数据结构——字典树 学习笔记

字典树,也叫 trie 树。

检索字符串

本质是记录字符串前缀的一棵查找树,形态类似于:

image

字典树使用边表示字母,节点表示一个前缀,同时也可以在节点上记录状态 \(\mathit{tag}\)。

基本实现形如:

var:
	nex[0..siz][0..rng], idx
	est[0..siz], pre[0..siz]
function insert(str, map): -> void
	root := 0
	for c in str:
		pos := map(c)
		if nex[root][pos] = 0:
			nex[root][pos] := ++idx	// 分配节点
		p := nex[root][pos]
		++pre[p]	// 前缀计数
	est[p] := True	// 存在
function is_exist(str, map): -> boolean
	root := 0
	for c in str:
		pos := map(c)
		if nex[root][pos] = 0:
			return False
		root := nex[root][pos]
	return est[root]
function is_prefix(str, map): -> boolean
	root := 0
	for c in str:
		pos := map(c)
		if nex[root][pos] = 0:
			return False
		root := nex[root][pos]
	return True
function cnt_prefix(str, map): -> integer
	root := 0
	for c in str:
		pos := map(c)
		if nex[root][pos] = 0:
			return 0
		root := nex[root][pos]
	return pre[root]

01-trie

01-trie 是指字符集为 \(\{0,1\}\) 的 trie 树。01-trie 可以用来维护一些数字的异或和,支持修改(删除 + 重新插入),和全局加一。如果要维护异或和,需要按值从低位到高位建立 trie。

对于简单题来说,就是前面的板子不用修改。

难题我也不会,不知道咋用,见 https://oi-wiki.org/string/trie/#维护异或和 吧。

示例代码(P4551 最长异或路径):

struct Trie {
    vector<array<int, 2>> ch; int idx;
    function<void(int)> insert = [&] (int x) {
        int root = 0; for (int k = 30; ~k; --k) {
            int pos = (x >> k) & 1;
            if (!ch[root][pos]) ch[root][pos] = ++idx;
            root = ch[root][pos];
        } return (void)("rp++");
    }; function<int(int)> query = [&] (int x) {
        int root = 0, r = 0; for (int k = 30; ~k; --k) {
            int pos = (x >> k) & 1;
            if (ch[root][pos ^ 1]) root = ch[root][pos ^ 1], r |= 1 << k;
            else if (ch[root][pos]) root = ch[root][pos];
            else throw("UNKNOWN ERROR");
        } return r;
    }; Trie(int N) { idx = 0, ch.resize(N); }
} trie(n * 31 + 5);

Reference

[1] https://oi-wiki.org/string/trie/

标签:str,int,pos,笔记,trie,nex,数据结构,root,字典
From: https://www.cnblogs.com/RainPPR/p/trie.html

相关文章

  • 偏序问题学习笔记
    前提给若干个\(n\)维的点,对于每个点求出每一维均小于等于它的点的数量。按字典序排序,然后预处理相同的点,这样后面的点不可能对前面的点产生贡献。如果某个点后面有与其相同的点,那么当前点的贡献就会少算,所以我们需要提前在当前点的答案中加上后面与其相同的点的数量。经过这......
  • 密码学笔记
    密码算法:对称密码算法、非对称密码算法、摘要算法对称密码算法:加密秘钥和解密秘钥相同的密码算法又称秘密秘钥算法或单秘钥算法分组密码算法(BlockCipher):块加密算法将明文拆分为N个固定长度的明文块用相同的秘钥和算法对每个明文块加密得到N个等长的密文块然后将N个......
  • Redis数据结构之动态字符串SDS
    动态字符串SDS我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:V获取字符串长度的需要通过运算V非二进制安全V不可修改Redis构建了一种新的字......
  • uniapp开发笔记
    控件toast控件uni.showToast({icon:'none',title:'输入topic'})注意点引入图片需要的注意事项图片的宽度不能是auto相对路径和绝对路径绝对路径要以/开头示例代码{bigUrl:"static/image/img/Children.jpg",data:[{......
  • 34课笔记
     ......
  • openGauss学习笔记-123 openGauss 数据库管理-设置账本数据库-账本数据库概述
    openGauss学习笔记-123openGauss数据库管理-设置账本数据库-账本数据库概述123.1背景信息账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表。当用户创建防篡改用户表时,系统将自动为该表添加一个hash列来保存每行数据的hash摘要信息,同时在blockc......
  • 《人机交互:以用户为中心的设计和评估》阅读笔记一
    人机交互学(humen-computerinteraction,HCI)是一门关于设计和评估以计算机为基础的系统而使这些系统能够最容易地为人类所使用的学科。以用户为中心的设计和评估的最基本思想就是将用户时时刻刻摆在所有过程的首位。在产品生命周期的最初阶段,产品的策略应当以满足用户的需求为基本......
  • 《软件工程导论》读书笔记2
    在当今这个信息化时代,软件已经成为我们生活中不可或缺的一部分。从手机应用到大型系统,软件无处不在。为了更好地理解和掌握软件开发的过程和方法,我阅读了《软件工程导论》这本书。以下是我在阅读过程中的一些心得体会和收获。软件工程的定义和目标软件工程是一门研究如何有效......
  • CS224n笔记:word2vec(1)
    目录离散语义(discrete):分布语义(distribute):tokens、types分布的语言模型(distributionallanguagemodel):词嵌入模型Word2VecObjectivefunc(目标函数)Lossfunc(损失函数)P(O|C)和Softmax(x)P(O|C)的概率分布将损失函数展开求梯度公式损失函数的时间复杂度ChainRule:链......
  • 【笔记】可删除堆
    可删除堆考虑到没什么人会选择手写普通的堆,所以用优先队列实现就好。问题:我们知道,在使用堆或优先队列的时候,我们只能取出堆顶,也就是所维护的最大或最小值。那么如果我们要从所维护的一个元素里删除一个非最大或最小值呢?最暴力的做法是将元素一个一个从堆顶弹出,直到弹出我们要......