引言
小森是一名 “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