首页 > 其他分享 >字典树-trie

字典树-trie

时间:2024-12-01 22:25:08浏览次数:4  
标签:cnt trie ++ 单词 int 字典

(发文的目的是为了记录学习算法的历程,而不是教程)
引子
如果想要再字典里查找“salieri”这个单词,我们会怎么做,比较朴素(bushi)的想法是从字典的第一个单词翻到最后一个单词,这种方法虽然(蠢)简单,但是却很花时间,当然,
聪明(正常)的你肯定会按照索引来查找,而字典树正是借用了这种索引的思想。
字典树Trie
来看下面这张图:

从根节点出发(根节点不存储字符),按某条路径走最后可以得到一个单词比如 1->2->5就得到了aa。字典树的结构相当的简单。
下面代码是封装成结构体的字典树

点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct Trie {
	int trie[10000][26],cnt=0;            //cnt记录当前节点的个数。其次根据记录在树中的字符不同,26这个范围可能会变
	bool exist[10000];					  //exist 数组记录当前节点是否为某个单词的结尾				

	void insert(string& s);   
	bool find(string& s);
};

//插入一个单词
void Trie::insert(string& s) {
	int p = 0;
	for (int i = 0; i < s.size(); i++) {
		int c = s[i] - 'a';
		if (!trie[p][c]) trie[p][c] = ++cnt;
		p = trie[p][c];
	}
	exist[p] = trie;
}
//寻找某个单词是否存在
bool Trie::find(string& s) {
	int p = 0;
	for (int i = 0; i < s.size(); i++) {
		int c = s[i] - 'a';
		if (!trie[p][c]) return false;
		p = trie[p][c];
	}
	return exist[p];
}

01Trie
如果将二进制数看成01字符串,我们也可以将其存入字典树中,我们将二进制数从高位开始存入字典树中,
从而我们可以快速的求出某两个数最大或最小的异或和
例题:
【模板】字典树

Macesuted 给了你 n 个整数。
他想要知道任意两数异或和最大是多少。

参考代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int trie[10000005][2], cnt;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int n; cin >> n;
	vector<int>a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		int p = 0;
		for (int j = 30; j >= 0; j--) {          //二进制数最多有31位,从最高位开始存入
			int c = (a[i] >> j) & 1;			 //通过位运算求出某一位
			if (!trie[p][c]) trie[p][c] = ++cnt;
			p = trie[p][c];
		}
	}
	int ans = 0;
	for (int& x : a) {                           //遍历每一个数,求与其它数的最大异或和
		int tans = 0, p = 0;              
		for (int i = 30; i >= 0; i--) {
			int c = (x >> i) & 1;                //如果当前位是0,有1就走1,否则走0;反之同理。
			if (trie[p][1 - c]) {                
				tans = tans | 1;                 
				tans = tans << 1;
				p = trie[p][1 - c];
			}
			else if (trie[p][c]) {
				tans = tans << 1;
				p = trie[p][c];
			}
			else break;
		}
		ans = max(tans, ans);
	}
	cout << (ans >> 1) << endl;

标签:cnt,trie,++,单词,int,字典
From: https://www.cnblogs.com/Amadeus-maho/p/18580430

相关文章

  • 生鲜配送ERP系统_升鲜宝生鲜配送供应链管理系统Mysql表结构数据字典的生成小工具V0.01
    生鲜配送ERP系统_升鲜宝生鲜配送供应链管理系统Mysql表结构数据字典的生成小工具V0.01_SaaS全链路生鲜供应链管理系统_升鲜宝_15382353715 最近要交付升鲜宝生鲜配送供应链管理系统源代码给上海的客户,需要将蓝湖UI设计图及数据字典交接给别人。在网上找了半天没有找到合适的根......
  • Trie树-字典树笔记
    Trie树-字典树笔记Trie树是一种高效的存储字符串的数据结构,它将多个字符串的前缀合并在一条边上,每次插入时,都判断当前的树上有无能够重合的前缀,如果没有就单独增加一个节点。通过合并前缀,可以做到快速查找已经优化空间的操作。下面是使用数组模拟实现Trie树的部分代码:我们首先......
  • 升鲜宝生鲜配送供应链管理系统Mysql表结构数据字典的生成小工具V0.01
    最近最近要交付升鲜宝生鲜配送供应链管理系统源代码给上海的客户,需要将蓝湖UI设计图及数据字典交接给别人。在网上找了半天没有找到合适的根据Mysql生成Word数据字典,自己就写了几行代码,记录一下.后面可能会继续改造。主要的代码如下:usingSystem;usingSystem.Collections.Gene......
  • 第一篇 Python字典
    1.前言字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中,格式如下所示:d={key1:value1,key2:value2}注意:dict 作为Python的关键字和内置函数,变量名不建......
  • 列表和字典的操作
    #list和dict的相关操作#lista=[1,2,3,4,5,6,7]#1.通过下标获取元素##2.在已有的list末尾添加新的元素#append##3.删除元素#基于元素下标进行删除#dela[-1]#基于元素值进行删除#a.remove(1)#4.获取list的长度#print(len(a))#5.排序#b=[2,1,4,3,5,88,33]#b.sort(......
  • Retrieval Augmented Generation (RAG) (1/2),RAG介紹
    介紹RetrievalAugmentedGeneration(RAG)其實就是優化大型語言模型(LLM)輸出的過程。在生成回應之前,RAG會參考訓練資料以外的權威知識庫。大型語言模型是在大量資料上訓練出來的,擁有數十億個參數,可以回答問題、翻譯語言、完成句子等等。RAG讓這些本來就很強大的模型可以使用特......
  • 从零开始的Python世界生活——基础篇(Python字典)
    从零开始的Python世界生活——基础篇(Python字典)1.Python字典是什么?​Python字典是python中非常重要的非常灵活和强大的内置数据结构,用于存储键值对(key-value),Python中的字典等价于数学中的映射,也就是key(键)与value(值)一一对应。我们可以通过查找key(键)来获得key(键......
  • 从零开始的Python世界生活——基础篇(Python字典)
    从零开始的Python世界生活——基础篇(Python字典)1.Python字典是什么?​ Python字典是python中非常重要的非常灵活和强大的内置数据结构,用于存储键值对(key-value),Python中的字典等价于数学中的映射,也就是key(键)与value(值)一一对应。我们可以通过查找key(键)来获得key(键)所对......
  • 【RAG 项目实战 07】替换 ConversationalRetrievalChain(单轮问答)
    【RAG项目实战07】替换ConversationalRetrievalChain(单轮问答)NLPGithub项目:NLP项目实践:fasterai/nlp-project-practice介绍:该仓库围绕着NLP任务模型的设计、训练、优化、部署和应用,分享大模型算法工程师的日常工作和实战经验AI藏经阁:https://gitee.com/fasterai......
  • Python知识点精汇:字典篇精汇!
    目录一、字典是什么二、字典长什么样三、字典的基本操作(1)新增元素(2)删除元素(3)清空元素(4)获取全部键值四、其他(1)字典的遍历(2)定义嵌套字典(3)字典的合并(4)返回指定的键的值,找不到键时返回预设值(5)返回指定的键的值,找不到键时,将该键更新到字典中一、字典是什么字如其名......