☘前言☘
最近的计划是花两个月的时间,在回所之前把算法笔记刷完,不知道能不能显示了,希望大家监督我,最近疫情好严重,被封校了,大家也要注意安全呀。 |
文章目录
🍘一、相关知识点
🎐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,大佬们刷完打个卡
大家加油冲!!!!