链式哈希,一致性哈希,倒排表

news2024/12/28 18:36:31

在普通的查询中,通过关键码的比较进行查找,而哈希是根据关键码直接定位到数据项

哈希冲突:同一个关键码经过哈希函数后指向同一个记录集

链式哈希

using namespace std;
#define M 13
typedef int KeyType;
//typedef struct
//{
//	KeyType key;
//	Record recptr;
//}Elemtype;
typedef struct HashNode
{
	HashNode* next;
	KeyType key;
} HashNode;
typedef struct
{
	HashNode* data[M];
	int cursize;
}HashTable;
HashNode* BuyNode()
{
	HashNode* s = (HashNode*)calloc(1, sizeof(HashNode));
	if (s == nullptr)exit(1);
	return s;
}
void FreeNode(HashNode*p)
{
	free(p);
}
void InitHashTable(HashTable* pht)
{
	assert(pht != nullptr);
	pht->cursize = 0;
	for (int i = 0; i < M; i++)
	{
		pht->data[i] = 0;
	}
}
int Hash(KeyType kx)
{
	return kx % M;
}
bool Insert(HashTable* pht, KeyType kx)
{
	assert(pht != nullptr);
	int pos = Hash(kx);
	HashNode* p = pht->data[pos];
	while (p != nullptr && p->key != kx)
	{
		p = p->next;
	}
	if (p != nullptr) return false;
	HashNode* s = BuyNode();
	s->key = kx;
	s->next = pht->data[pos];
	pht->data[pos] = s;
	pht->cursize += 1;
	return true;
}
void PrintHashTable(HashTable* pht)
{
	assert(pht != nullptr);
	for (int i = 0; i < M; i++)
	{
		cout << "桶编号:" << i << "->" << " ";
		HashNode* p = pht->data[i];
		while (p != nullptr)
		{
			cout << p->key << " ";
			p = p->next;
		}
		cout << endl;
	}
}
int main()
{
	KeyType ar[] = { 19,14,23,1,68,20,84,27,55,11,10,79};
	int n = sizeof(ar) / sizeof(ar[0]);
	HashTable ht;
	InitHashTable(&ht);
	for (int i = 0; i < n; i++)
	{
		Insert(&ht, ar[i]);
	}
	PrintHashTable(&ht);
}

结果:

 删除

bool Remove(HashTable* pht, const KeyType kx)
{
	if (pht == nullptr) { return false; }
	int pos = Hash(kx);
	HashNode* p = pht->data[pos];
	HashNode* ptr = nullptr;
	while (p != nullptr && p->key != kx)
	{
		ptr = p;
		p = p->next;
	}
	if (p == nullptr) { return false; }
	if (ptr == nullptr)
	{
		pht->data[pos] = p->next;
		free(p);
		p = nullptr;
	}
	else
	{
		ptr->next = p->next;
		free(p);
		p = nullptr;
	}
	pht->cursize -= 1;
	return true;
}

一致性哈希

 采用虚拟节点的方式,解决了添加和删除物理节点时,资源分配会不均匀的问题。

倒排表

到排表是搜索引擎的核心架构

假设我们爬取了4个文档,里面的内容如下


基于4个文档,写出我们的词库 [我们,今天,运动,昨天,上,课,什么]
统计词库中的每个单词出现在哪些文档中,显然 我们 出现在[doc1,doc2] 中

这样我们就可以把文档以到排表的方式存储了,这样做有什么优点呢???
假如用户输入:我们 上课
如果没有到排表,则只能一篇一篇的去搜索文档中 是否既包含我们又包含上课,这样复杂度太高了
有了到排表:我们知道 我们[Doc1, Doc2], 上 [ Doc3,Doc4], 课[Doc3,Doc4], 如果有交集,我们可以直接返回交集,如果没有交集,那么直接返回
并集[ Doc1,Doc2, Doc3,Doc4]

 倒排的优缺点和正排的优缺点整好相反。
所有正排的【优点】易维护;【缺点】搜索的耗时太长。
倒排【缺点】在构建索引的时候较为耗时且维护成本较高;【优点】搜索耗时短(在处理复杂的多关键字查询时,可在倒排表中先完成查询的交、并等逻辑运算,得到结果后再对记录进行存取。这样不必对每个记录随机存取,把对记录的查询转换为地址集合的运算,从而提高查找速度)。
 

template<class TKey = std::string>
class InvIndex : public map<TKey, list<int>>
{
public:
	vector<vector<TKey>> docs;
public:
	void add(vector<TKey>& doc)
	{
		docs.push_back(doc);
		int curDocID = docs.size();
		for (int i = 0; i < doc.size(); i++)
		{
			typename map<TKey, list<int> >::iterator it;
			it = this->find(doc[i]);
			if (it == this->end())
			{
				list<int> newlist;
				(*this)[doc[i]] = newlist;
				it = this->find(doc[i]);
			}
			it->second.push_back(curDocID);
		}
	}
};
int main()
{
	string d1_tmp[] = { "杨和平","按泽鹏","殷培文","谢家桥","释小龙" };
	int n = sizeof(d1_tmp) / sizeof(d1_tmp[0]);
	vector<string>d1(d1_tmp, d1_tmp + n);
	string d2_tmp[] = { "杨和平","里加长","房价想","谢家桥","冬温慧" };
	n = sizeof(d2_tmp) / sizeof(d2_tmp[0]);
	vector<string>d2(d2_tmp, d2_tmp + n);
	string d3_tmp[] = { "释小龙","按泽鹏","殷培文","里加长","样变变" };
	n = sizeof(d3_tmp) / sizeof(d3_tmp[0]);
	vector<string>d3(d1_tmp, d1_tmp + n);
	string d4_tmp[] = { "杨和平","房价想","殷培文","谢家桥","作结" };
	n = sizeof(d4_tmp) / sizeof(d4_tmp[0]);
	vector<string>d4(d4_tmp, d4_tmp + n);
	std::shared_ptr<InvIndex<string>>inv(new InvIndex<string>());
	inv->add(d1);
	inv->add(d2);
	inv->add(d3);
	inv->add(d4);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开放式耳机和封闭式耳机的区别有哪些?开放式耳机有哪些推荐?

开放式耳机和封闭式耳机的区别主要在以下几个方面&#xff1a; 设计结构&#xff1a;开放式耳机通常有一个开放的设计&#xff0c;不需要塞入耳即可收听音乐&#xff0c;同时与外部环境进行交互。封闭式耳机则是封闭的设计&#xff0c;耳机驱动单元之间是封闭和隔离的&#xf…

电子科技大学编译原理复习笔记(一):绪论

目录 前言 重点一览 语言的分类 冯诺依曼体系结构 绑定的概念 变量 虚拟机 程序单元 本章小结 前言 本复习笔记基于张老师的课堂PPT&#xff0c;供自己期末复习与学弟学妹参考用。 重点一览 语言的分类 命令式语言&#xff08;强制式语言&#xff09;&#xff1a;冯…

Activity的预览窗口StartingWindow添加

Activity的预览窗口StartingWindow添加 1、Activity组件启动2、ActivityStarter.java#startActivityInner() > 主要查看Task.java#startActivityLocked3、ActivityRecord.java#addStartingWindow到WindowManagerService.java#addWindow3.1 ActivityRecord.java#addStartingW…

一文搞定验证码(下部分)

文章目录 1.背景2.验证3.valid接口具体实现类SimpleImageCaptchaValidator 1.背景 上一篇文章讲了验证码生成的逻辑. 验证码-上篇. 大概来说就是: 服务端保存一些默认的验证码图片. 然后需要生成时创建一个包含随机字符的验证码字符图片根据随机字符和一些参数&#xff08;如…

新入职一个00后卷王,每天加班到2点,太让人崩溃了····

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

chatgpt赋能python:PythonScheme:为什么你应该考虑在你的下一个项目中使用它

Python Scheme&#xff1a;为什么你应该考虑在你的下一个项目中使用它 介绍 Python是一种常用的编程语言&#xff0c;被广泛应用于各种应用程序&#xff0c;包括Web开发、数据分析和人工智能。今天&#xff0c;我们要讨论的是Python编程语言的一种方言&#xff0c;名为“Pyth…

HR不会告诉你!Java程序员月薪8K和20K的区别!

昨天有同学问好程序员&#xff0c;为啥都是干Java程序员&#xff0c;别人可以拿20k&#xff0c;我才拿8k呢&#xff1f;为啥人家能提前转正我就得晚俩月&#xff1f;小源一听大事不妙&#xff0c;赶紧连夜整理了以下清单供大家check&#xff01; 对于刚入职场还有跳槽成功的同学…

【2023 · CANN训练营第一季】昇腾AI入门课(TensorFlow)微认证考试

1、下面哪个AI框架开发模型可以不用适配&#xff0c;直接在昇腾AI处理器上进行训练&#xff1f; A. PyTorch B. Caffe C. Mindspore D. Tensorflow C 2、使用Estimator进行脚本训练开发的一般步骤为&#xff08;A&#xff09; A. 数据预处理 --> 模型构建 --> 运行配置 -…

苏诗:医疗器械企业增长秘籍之CRM系统的 4 大能力建设

近些年&#xff0c;在国家医疗产业政策支持的推动下&#xff0c;医疗器械产业已进入蓬勃发展的“黄金时期”&#xff0c;医疗器械产品丰富度增加&#xff0c;配套服务体系逐渐完善&#xff0c;国产品牌效应进一步凸显。 医疗健康行业是纷享的战略行业之一&#xff0c;自2017年…

chatgpt如何自动生成角色prompt模板

chatgpt如何自动生成角色prompt模板 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、角色prompt模板 下面是套图的chatgpt模板&#xff0c;你可以手动的进行填写。将角色的描述填…

如何把数据从 TDengine 2.x 迁移到 3.x ?

一.迁移背景&#xff1a; 随着时序数据库&#xff08;Time Series Database&#xff09; TDengine 3.0 的发布至今&#xff0c;我们除了在持续地优化产品质量的本身&#xff0c;也一直在努力地提升用户体验。但由于 3.0 底层有大量的重构优化&#xff0c;导致开源版的 2.0 用户…

集权攻击-无权限条件下AD域凭据获取与利用分析

前言 对AD域攻击的前期&#xff0c;在没有任何域内据点或域用户凭据时&#xff0c;攻击者往往会使用用户名枚举、密码爆破、密码喷洒、Roasting等手段进行域用户凭据的窃取&#xff0c;本篇文章将针对AD域攻击时无权限环境下对域用户的信息收集及凭据窃取进行分析。 用户名枚举…

四、CNNs网络架构-深度可分离卷积

《A review of convolutional neural network architectures and their optimizations》论文指出一些高性能的卷积神经网络方法不可避免地带来巨大的计算成本&#xff0c;往往需要高性能GPU或高度优化的分布式CPU架构的支持。尽管CNNs应用向移动终端扩展&#xff0c;但大多数移…

如何在Spring Boot服务端实现公网远程调试并进行HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Go语言 -- Web开发基础学习 net/http包

前言 Go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 Go语言最擅长的领域就是Web开发&#xff0c;此贴是本人入门完go语法基础后学习Web开发的学习笔记。 第一个Go Web 新建go文件hello_world.go 写入&#xff1a; package mainimport (&…

企业级信息系统开发——初探Spring AOP

文章目录 一、提出游吟诗人唱赞歌任务&#xff08;一&#xff09;采用传统方式实现&#xff08;二&#xff09;采用传统方式实现的缺点 二、采用配置方式使用AOP&#xff08;一&#xff09;创建本讲所需子包&#xff08;二&#xff09;创建杀龙任务类&#xff08;三&#xff09…

VESD静电监控系统:提高静电防护效果与管理效率

随着科学技术不断发展&#xff0c;现代的工业对静电防护的要求越来越高。因为静电的存在可能会对产品质量、工作环境、甚至是人身产生威胁。静电监控系统是一项高效的管理工具&#xff0c;能够有效地控制和监测静电产生的情况&#xff0c;提高静电防护效果和管理效率。 VESD静电…

群晖DS920 video station使用教程

群晖DS920 video station使用教程 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 安装video station在群晖套件里点一下就好&#xff0c;这里不说了。 一、添加视频库 可以添加电视剧、电视节目等类型。 比如我在国产剧这个视频…

写出诗一样代码的灵丹妙药: const与assert

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;…

网络安全好就业吗?会不会容易被淘汰?

网络安全发展前景好吗&#xff1f;好就业吗&#xff1f;会不会容易被淘汰&#xff1f;很多刚入门或者想入门的小伙伴都会有这样的疑问 今天就在这里给大家介绍一下。我就在这个行业&#xff0c;目前湖南&#xff0c;薪资就没必要说了&#xff0c;高就对了。 这个行业优势就是工…