前言
重学算法第7天,希望能坚持打卡不间断,从基础课开始直到学完提高课。
明天再来!肝就完了
2月19日,day07 打卡
今日已学完y总的
算法基础课-2.5-第二章 数据结构(三)
共2题,知识点如下
哈希表:
模拟散列表、
字符串哈希。
以及介绍了算法中STL常用容器的基本用法及函数。
Hash表
按照冲突的处理方式,分为两种。即开发寻址法和拉链法
将一堆数据映射到0-N
将-109到109范围的数,映射到
[0,10^5^]
内
之前的离散化是一种极其特殊的哈希方式(需要保序),
这里讲的是一般意义的哈希方式。不太一样
拉链法:两个数冲突,就用一条链都给它存下来
哈希算法是一种期望算法,虽然每个槽会拉一个链
但平均情况下看,每个链的长度都可以看成一个常数,
所以一般情况下,哈希表的时间复杂度可以看成O(1)
算法题中一般是不需要在哈希表中执行删除元素
一般只有添加和查找两个操作(算法题中)
基本操作
添加操作:在h(x)下面拉个链存进去
查找操作:看看h(x)下面那个链,遍历一遍
删除操作:如果非要整,也不会真的删除,会在链上那点用bool变量标记一下
开放寻址法和拉链法都很常用,任选一种即可
数组长度,也就是模的那个数(上面是105),
一般要取成质数,而且这个质数要离2的整次幂尽可能的远
数学上可以证明,如果这么选,冲突的概率是最小的
找出大于10w的最小的质数,即100003
#include <iostream>
using namespace std;
const int N = 100003;
int main() {
for (int i = 100000;;i++) {
bool flag = true;
for (int j = 2; j * j <= i; j++)
if (i % j == 0) {
flag = false;
break;
}
if (flag) {
cout << i << endl;
break;
}
}
return 0;
}
// 100003
一般哈希
模板
(1) 拉链法
int h[N], e[N], ne[N], idx;
// 向哈希表中插入一个数
void insert(int x)
{
int k = (x % N + N) % N;
e[idx] = x;
ne[idx] = h[k];
h[k] = idx ++ ;
}
// 在哈希表中查询某个数是否存在
bool find(int x)
{
int k = (x % N + N) % N;
for (int i = h[k]; i != -1; i = ne[i])
if (e