散列(Hash)查找

  1. 设有一长度为m的散列空间:将某一数据集合中的数据存储在该散列空间中
  2. 散列函数:用来计算存储数据元素的地址的函数
    H(k)=k%m(除留余法)
    缺陷:容易造成堆积
    容易产生冲突(即地址被占用)
    解决冲突:
    线性探查法:d=(d+1)%m/(d+i^2)%m

拉链法:其实就是用链表的结构特点,将要查找的元素范围急剧缩小
在里面进行查找,如果地址里内容为空或者跑完局部链没找到说明没有此元素 反之找到

#include<bits/stdc++.h>
#define N 13//哈希”数组”长度
using namespace std;
typedef struct node{
	int data;
	struct node *next;
}ElemSN;
ElemSN **CreateHash(int a[],int n)
{
	ElemSN **head;
	ElemSN *tail,*np;
	head=(ElemSN **)malloc(N*sizeof(ElemSN *));
	int i,t;
	for(i=0;i<N;i++){//初始化哈希“数组“ 
		head[i]=NULL;
	}
	for(i=0;i<n;i++){//创建哈希表 
		np=(ElemSN *)malloc(sizeof(ElemSN));
		np->data=a[i];
		np->next=NULL;
		t=a[i]%N;//计算地址 
		for(tail=head[t];tail&&tail->next;tail=tail->next);//判断哈希数组是否为空 
		if(!tail){//为空,将新的结点链入 
			head[t]=np;
		}
		else{//不为空,将新结点尾插都已有链上
			tail->next=np;
		} 
	}
	return head;
}
void PrintHash(ElemSN **head)
{
	ElemSN *p;
	int i;
	cout<<"地址"<<"\t"<<"元素"<<"\t"<<"\n";
	cout<<"...................."<<"\n";
	for(i=0;i<N;i++){
		cout<<i<<"\t";
		for(p=head[i];p;p=p->next){
			cout<<p->data<<"\t"; 
		} 
		cout<<"\n";
	} 
} 
ElemSN *FindKey(ElemSN **head,int key)
{
	ElemSN *p;
	int i;
	i=key%N;
	for(p=head[i];p&&p->data!=key;p=p->next);
	return p;
}
int main()
{
	int n,key;
	cout<<"请输入哈希数组长度n:";
	cin>>n;
	ElemSN **head;
	ElemSN *p;
	int a[n];
	cout<<"请输入元素:";
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cout<<"请输入key:";
	cin>>key;
	head=CreateHash(a,n);
	PrintHash(head);
	p=FindKey(head,key);
	if(!p){
		cout<<"Not Found!";
	} 
	else{
		cout<<"\n"<<p->data;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值