第四章-散列

本文详细介绍了散列的概念,包括散列函数H(key)的常见方法,如直接定址法、平方取中法、除留余数法。重点讨论了哈希表及其解决冲突的策略,如开放寻址法(线性探查、平方探查、双重散列)和链表法。此外,还探讨了非整数key(如二维整点、字符串)的散列处理方法。
摘要由CSDN通过智能技术生成

散列(hash)

将元素通过一个函数转换为整数,使得该整数可以尽量唯一地代表这个元素。
这个转换函数称为散列函数H,如果元素在转换前为key,那么转换后就是一个整数H(key)

散列表也叫哈希表,是根据键(key)而直接访问在内存存储位置的数据结构。通过一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,加快了查找速度。映射函数称为散列函数,存放记录的数组称作散列表。

key为整数时
(1)直接定址法(重要)
H(key)=key或者H(key)=a*key+b
直接把key作为下标或者线性变换

问题:给出N个整数,再给出M个整数,问这M个数中的每个数分别是否在N个数中出现过,其中N,M<=105.
空间换时间。设定bool类型数组hashTable[100010],初始化为false(正整数x在N个正整数中未出现);
读入一个x,就令hashTable[x]=true;
这种做法的时间复杂度为O(N+M)

#include<stdio.h>
const int maxn=100010;
bool hashTable[maxn]={
   false};
int main(){
   
	int n,m,x;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
   
		scanf("%d",&x);
		hashTable[x]=true;
	}//输入N里面的数字 
	for(int i=0;i<m;i++){
   
		scanf("%d",&x);
		if(hashTable[x]==true){
   
			printf("Yes\n");
		}else{
   
			printf("No\n");
		}
	}//输入M里的数字并判断在N里是否出现。 
	return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值