散列,字符串hash初步

散列是一种以空间换时间的算法思想,以整数散列为列,其精髓就在于用其一个整数数组的下标对应操作输入的对象,要查找这个对象,就直接查找其对应的下标里面信息。
举个例子: 随便输入n个数a(0-100),再输入m个数b,查询他们在这n个数中出现了几次?

这个时候我们建立一个101大的整数数组t初始为0,直接以数组下标标识0-100的数,输入a时,令t[a]++就代表那个数查询了,查询的时候也方便,t[b]大小就是b出现的次数。
再问: 如果关键词不是整数,而是字符串或坐标等别的数据怎么办?
这时候,就要体现散列的精髓了- hash函数的构造,下面以字符串为例:
现在输入的不是数了,而是3个小写字母的单词,应该怎么办?

分析小写字母是a-b,共26位,如果把它们考虑成一个26进制数,转化为十进制就会有一个唯一十进制数与之对应,借此思想我们设计程序如下:

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=26*26*26+1;
int t[maxn]={0};


int hashfunc(char s[],int n) {  //将字符串转化为十进制数,hash函数 
	int id=0;
	for(int i=0;i<n;i++)
	id=id*26+(s[i]-'a');
	return id;
}

int main(){
	
	char s[3];
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{   
		for(int j=0;j<3;j++)
		cin>>s[j];
		t[hashfunc(s,3)]++;
	}
	for(int j=0;j<3;j++)
		cin>>s[j];	
	cout<<	t[hashfunc(s,3)]<<endl;
	return 0;
}

一个结果:
在这里插入图片描述
显然,如果一个字符串数据太大,这样就不太适合,至于处理方法,我们将在字符串部分讲解

发布了63 篇原创文章 · 获赞 6 · 访问量 2033

猜你喜欢

转载自blog.csdn.net/qq_36684096/article/details/104342695