数据结构算法-哈希表技术点

引言

小森是一名 “ikun科技大制作创作者” 但有自己的团队 团队有20个人, 4个人为一组 ,一共有五组
分别为 策划组, 制作组, 配音组 ,编剧组, 调音组
为了方便就为每一个组的人就起了编号 以后方便"考察每个人是否工作"
在这里插入图片描述
可以看到效率大大的提高工作效率 ,当然真ikun 是真的为爱发电做出来:第一个 “科你太美PV”" 来致敬科比,
当然由于科技含量,最大化 最终真正出来"科技小森寻找科比"这个"游戏"
接下来 “科技小森寻找科比” 可能还得扩展到"鹰酱",并且在文化和科技反复碾压",让他们非常服
突然"科技小森工作室"宣布和"米啊游"合并 并且打造 “ikun文化” 让"ikun 文化名扬万朽"
在这不愧是"我森哥的格局最大"

从这里让人明白了一个关键点: 分散的重要性 就是非常好查找数据
在这里插入图片描述
肯定某个组有人因为薪资问题离开,这就恰到好处,无论是哪个组哪个人都会有编号
比如说"配音组里的1002 因为薪资问题.未能得到解决",那只好辞退Ta 并且赔偿一些费用
非常快速把ta从数字存储引擎把Ta的个人档案销毁

以下这种情景,我想一定能撬开阁下的嘴(,哈哈哈,笑不活了)

好了 该到打退骚针的时候 那么 这算不算是本文章的主题?

当然算,不然我怎么可能会说出来呢 (注意看 这个作者 有点骚 需打一针 ,退骚针就好了)在这里插入图片描述

哈希表原理

哈希表也称之为散列表
在这里插入图片描述

顺序表和链表的结合体 重温 一下 顺序表 的优点 :可控范围随机访问 链表的优点 :插入非常快 删除非常快
所以说链表和顺序表是互补的,
将二者合二为一 就变成 哈希表
可以看到,这就是一个指针数组 维护一大堆的链表
你需要知道的是: 数据如何插入和删除
难道顺着插入?
要是这样的话 还不如用链表
在这里插入图片描述
所以引用 “哈希函数”
“哈希函数”: 将数据转化为数字 映射到哈希表里的一种函数 也就是说 将数据转化为序号,最后插入到哈希表
哈希函数 可以多种多样 最多用的是取余
这对于通用的数据来采取的方式

在这里插入图片描述

哈希桶:存放链表的数组 或者 顺序表的数组
在这里插入图片描述
数据:采用键值(key/value)对的方式,键是哈希桶的编号 值是对应的数据,
这种非常神奇神奇到忽略不计去 哈哈
这种方式可能非常快速的找到对应的数据
通过上面的引言都知道 组就是键,数据是员工编号

我们的指纹识别就是用了这样的哈希表原理
音乐的听歌识曲也用了底层算法,所以现在知道为啥第一次办理身份证的时候就录入指纹 只要你一旦犯罪 人民警察会通过指纹快速查找到犯罪嫌疑人

哈希表算法实现

哈希链表定义

  • 数据的定义
 using Key = int;
 using Value = use define;

//哈希数据
struct HashValue{
   
	Key key;
	Value value;
};

struct LinkNode{
   
   
   HashValue MyHashValue;
   LinkNode*Next; 
};
//哈希表元素类型
using HashElement=LinkNode*;

哈希表定义

//默认桶空间容量
const int default_BucketSpaceSize = 16;
 
//哈希桶
using HashBucket = HashElement*;

//哈希表
struct HashTable{
   
   HashBucket BucketSpace;//桶空间
   size_t BucketSpaceSize;//桶空间大小
};

哈希链表创建算法

bool CreateHashTable(HashTable& HashTable, int BucketSpaceSize) {
   

	BucketSpaceSize = BucketSpaceSize <= 0 ? default_BucketSpaceSize : (BucketSpaceSize > default_BucketSpaceSize ? BucketSpaceSize : default_BucketSpaceSize);

	HashBucket BucketSpace = HashTable.BucketSpace = (HashElement*)malloc(sizeof(HashBucket) * (HashTable.BucketSpaceSize = BucketSpaceSize));


	if (BucketSpace) {
   

		for (size_t i = 0; i < BucketSpaceSize; i++) {
   

			BucketSpace[i] = (HashElement)malloc(sizeof(HashElement));
			*BucketSpace[i] = {
    };
		}

		return true;
	}

	return  false;

}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

哈希链表插入算法

首先 我们需要数据 那么得需要创建 按照我以前的骚操作文章,肯定得用创建哈希数据函数

创建哈希数据

//创建哈希数值类型
HashValue CreateHashValue(Key key, Value value){
   
	return {
    key,value };
}

创建哈希数据 之后该插入了

bool HashTableInsert(HashTable& HashTable, HashValue &&Val){
   

	HashBucket BucketSpace = HashTable.BucketSpace;

	//查找哈希表里的key是否能找到
	HashElement Find = HashTablFind(HashTable, Val.key);

	if (Find){
   
		RunNotFound(__func__, std::string("调用出现了问题! 问题的 \n") + "原因是" + std::to_string(Val.key) + "存在");
		return false;
	}
	
	int HashIndex = Hash(Val, HashTable);
	HashElement elementList = BucketSpace
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值