其他分享
首页 > 其他分享> > 数据结构--哈希表

数据结构--哈希表

作者:互联网

哈希表的主要作用:

把一个庞大的空间或值域映射到一个比较小的空间(10^5~10^6)

映射做法:x%(10^5~10^6);同时,取模的数要取成一个质数可以使冲突的概率最小。

因为值x的范围(10^9)比较大,映射的范围(10^5~10^6)比较小,所以可能会产生冲突(把若干不同的数映射成同一个数)

一、存储结构

题目:例题--哈希表(模拟散列表)_宋菜菜的博客-CSDN博客

1、开放寻址法

开一个比题目数据范围大2~3倍的数组(防止冲突),每一个值x插入或查找时,通过find函数返回值x需要插入或查找的下标。

int find(int x)//返回值x的下标
{
	int k=(x%N+N)%N;//如果x为负数(如-10^9),需要变成正数;
	while(h[k]!=null&&h[k]!=x)
	{
		k++;
		if(k==N) k=0;
	}
	return k;
}

2、拉链法

开三个数组h[],e[],ne[](e[]和ne[]分别代表单链表的值的存储数组和next数组),通过h[]的下标实现值x的插入和查找操作。

 

void insert(int x)//将值x插入
{
	int k=(x%N+N)%N;
	e[idx]=x;      //单链表
	ne[idx]=h[k];
	h[k]=idx++;
}
bool find(int x)//查找值x(存在返回true,不存在返回false)
{
	int k=(x%N+N)%N;
	for(int i=h[k];i!=-1;i=ne[i])
		if(e[i]==x) return true;
	return false;
}

二、字符串哈希方式

1、字符串前缀哈希法

预处理出所有前缀的哈希(数组h[i]表示前i个字母的哈希值)

1)把字符串哈希成一个数字(如何定义某一个前缀的哈希值?)

把字符串看成P进制的数

 当P=131或13331,Q=2^64时,一般情况下不会出现冲突。把字符串的哈希值h[]定义成无符号长整型(超出范围就会溢出),相当于进行取模。

 2)计算出任意子串的哈希值(如l~r之间的子串):h[r]-h[l-1]*p[r-l+1]。

因为子串是从高位到低位的,h[l-1]中1~l-1之间的子串和h[r]中1~l-1之间的子串不一样。

题目:例题--字符串哈希_宋菜菜的博客-CSDN博客

标签:子串,10,--,x%,int,哈希,字符串,数据结构
来源: https://blog.csdn.net/qq_63930662/article/details/122848400