第一天(数据三要素&大O记法)
第二天 (线性表【顺序存储&链式存储】)
第三天 (栈&队列)
第四天 (树#二叉树)
第五天 (查找&排序)
小项目 简易通讯录
哈希查找
- 哈希(hash) 查找
应用:海量数据查找
概念:
要查找key=k的记录时,通过关系f就可得到相应记录的地址。这个关系f就是所谓的Hash函数(或称散列函数、杂凑函数),记为H(key)。
它实际上是一个地址映象函数,其自变量为记录的key,函数值为记录的存储地址(或称Hash地址)。
不同的key可能得到同一个Hash地址,即当keyl≠key2时,可能有H(key1)=H(key2),此时称key1和key2为同义词。
这种现象称为“冲突”或“碰撞”,因为一个数据单位只可存放一条记录。
一般,选取Hash函数只能做到使冲突尽可能少,却不能完全避免
-
1.1 流程:
(1). 哈希公式
(2). 根据哈希公式创建哈希表
(3). 将数据存入哈希表
(4). 用户输入数据 程序负责根据哈希公式将数据进行处理 找到数据 -
3.2 最重要的两点:
a. 如何构建哈希函数。
b. 如何解决冲突。 -
3.2.1 构建哈希函数的方法:
直接地址法
数学分析法
平方取中法
叠加法
保留余数法
随机数法 -
3.2.2 解决冲突的办法:
开放地址法
线性探查法
链地址法
备用表法
- 保留余数法+备用表法
#include<stdio.h>
#define N 5
int j=0; //备用表下标
//哈希函数
int hashFun(int data)
{
return (data%5);
}
//存入数据
void saveHashMessage(int *phash,int *pbak,int data)
{
int index = hashFun(data); //哈希处理
if(phash[index]==0) //说明哈希表index对应的位置上没有数据
{
phash[index] = data; //将数据存入哈希表
}
else
{
pbak[j] = data; //将数据存入备用表
j++;
}
}
//查找数据
void findHashData(int *phash,int *pbak,int findData)
{
int i;
int index = hashFun(findData); //将数据哈希处理
if(phash[index]==findData) //去哈希表中找
{
puts("找到了");
return;//结束函数
}
//去备用表找
for(i=0;i<j;i++)
{
if(pbak[i]==findData)
{
puts("找到了");
return;//结束函数
}
}
puts("真没有!");
}
int main()
{
int hash[5]={0};//哈希表
int bak[13]={0};//备用表
int data;
int i;
int findData;//记录要查询的数据
for(i=0;i<N;i++)
{
puts("请输入数据:");
scanf("%d",&data);
saveHashMessage(hash,bak,data);
}
puts("请输入要查询的数据:");
scanf("%d",&findData);
findHashData(hash,bak,findData);
return 0;
}