0
点赞
收藏
分享

微信扫一扫

《算法笔记知识点记录》第四章——算法初步2——散列

慎壹 2022-04-13 阅读 19

请添加图片描述

☘前言☘

最近的计划是花两个月的时间,在回所之前把算法笔记刷完,不知道能不能显示了,希望大家监督我,最近疫情好严重,被封校了,大家也要注意安全呀。


文章目录


🍘一、相关知识点

🎐1.散列定义与整数散列

很难理解,但是其实我们会在不知不觉中用到这个知识点,我们先来看一个例子。

最简单的暴力肯定是嵌套循环,每次都去遍历,时间复杂度就达到O(MN)的量级。
我们优化的方式最容易想到的其实是给将N中所有元素映射到数组下标中,然后查表就好了。竞赛中的打表查表也是类似的空间换时间的方式。复杂度就降低到了O(M+N)。

const int maxn = 10010;
int hash[maxn] = {0};        //初始化为全不存在
int ans[maxn];
for(int i = 0;i < nsize;++i)
    hash[N[i]]++;          //建立hash表
 
for(int i = 0;i < msize;++i)
    ans[i] = hash[M[i]];    //查表输出;
rteurn ans;

上面这种方式虽然简单,但是请务必熟稔于心,尽量使用,使用场景非常多。


🍕2.整数的散列

  • 直接定址法(就是上面的那种)
  • 除留余数法(将元素对某个值取余,然后将元素放入相应的位置。)
  • 平方取中法(将元素平方取中间的几位作为转换后的对应位置、不是很常用)

最常用的就是除留余数法 H ( k e y ) = k e y H(key) = key % mod; H(key)=key

  • 线性探测法(产生冲突后向后推移几个单位寻找空位插入,很容易产生堆积)
  • 平方探测法(产生冲突后 按照、、…的方式探测)
  • 拉链法(将产生冲突的元素用链表链接起来,这算是一个链表的运用了。0.0)

👻3.字符串hash

首先有一个对应转换函数👇

int strtoint(char s[]){        //运用hash函数将字符串转整形
   int ans = 0;
   for(int i = 0;s[i] != '\0;++i){
       ans = ans * 26 + s[i] - 'A';
   }
   return ans;
}
bool hash[Nsize] = {false};
bool ans[Msize] = {false};

for(int i = 0;i < Nsize;++i)    hash[strtoint(N[i])] = true;//插入hash表
for(int i = 0;i < Nsize;++i)    if(hash[strtoint(M[i])])    ans[i] = true;

return ans;
}

🐳课后习题

我写完会放题解,大家写完了可以在评论区打卡哟!题解我放评论区吧,这样不用修改文章。

题目相同题目难度
《算法笔记》4.2小节——算法初步->哈希⭐⭐
A1084 Broken Keyboard (20 分)B1029 旧键盘 (20 分)⭐⭐
B1033 旧键盘打字 (20 分)⭐⭐
B1033 旧键盘打字 (20 分)⭐⭐
B1038 统计同成绩学生 (20 分)⭐⭐
A1092 To Buy or Not to Buy (20 分)B1039 到底买不买 (20 分)⭐⭐
B1042 字符统计 (20 分)⭐⭐
B1043 输出PATest (20 分)⭐⭐
B1047 编程团体赛 (20 分)⭐⭐
A1041 Be Unique (20 分)⭐⭐
A1050 String Subtraction (20 分)⭐⭐
B1005 继续(3n+1)猜想 (25 分)⭐⭐⭐
A1048 Find Coins (25 分)⭐⭐⭐

题解:评论区见,置顶没有就是我没写完0.0,大佬们刷完打个卡
大家加油冲!!!!

举报

相关推荐

0 条评论