标签:head Hash idx int 位置 哈希 表中 数据结构 刷题
文章目录
基本思想:将一个大范围的数映射到小范围上
1、可以采用取模的方式,例如1~10 9 映射到 1~10 5,直接x
%100000
即可。
2、取模冲突解决方式:拉链法、开放寻址法
(1) 拉链法:
开N个链表,N是比数据范围大的质数。
冲突的话在对应位置拉一条链,查找时沿着这条链查找
例如8%5=3,在3的位置放8;现在来了13,13%5=3,在3的位置拉一条链,链上填13。
int head[N], val[N], nxt[N], idx;
// 向哈希表中插入一个数
void insert(int x)
{
int k = (x % N + N) % N; // 保证余数为正
val[idx] = x;
nxt[idx] = head[k];
head[k] = idx ++ ;
}
// 在哈希表中查询某个数是否存在
bool find(int x)
{
int k = (x % N + N) % N;
for (int i = head[k]; i != -1; i = nxt[i])
if (val[i] == x)
return true;
return false;
}
(2) 开放寻址法
只开一个数组,长度(映射范围)是数据范围的2~3倍的质数。
冲突的话去数组的下个位置,如果下个位置还有人,那再去下下个位置,直到没人为止。
查找也是一样,找不到就去下个位置找。如果某个位置没人且还没找到,那就是没有。
int h[N];
int null = 0x3f3f3f3f;
memset(h, 0x3f, sizeof h);
// 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
int find(int x)
{
int t = (x % N + N) % N;
while (h[t] != null && h[t] != x)
{
t ++ ;
if (t == N) t = 0; // 从最后跳到第一个
}
return t;
}
例题
标签:head,Hash,idx,int,位置,哈希,表中,数据结构,刷题 来源: https://blog.csdn.net/qq_42581685/article/details/122765380
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。