1.哈希
哈希查找是通过计算数据元素的存储地址进行查找的一种方法。
采用最简单的除留取余法计算存储地址,用开放地址法中的线性探测法解决冲突。函数insert_hash用于将数据存储到数组中,函数search_hash用于按关键词查找。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define N 13
void insert_hash(int hashs[],int len,int key);
int search_hash(int hashs[],int len,int key);
int main()
{
int data[N]={0};
int key; /*待查关键字*/
int i;
for(i=0;i<6;i++) /*存储数据*/
{
scanf("%d",&key);
insert_hash(data,N,key); /*将值为key的关键字存入长度为N的数组data中*/
}
printf("Enter a key you want to search:");
scanf("%d",&key); /*输入待查关键字*/
int index=search_hash(data,N,key); /*在长度为n的数组data中查找关键字key*/
if(index>=0)
printf("The index of the key is %d.\n",index);
else
printf("Not found.\n");
return 0;
}
/*将值为key的关键字存入长度为N的数组data中*/
void insert_hash(int hashs[],int len,int key)
{
int i;
i=key%len; /*用留余数法计算出存储数据的位置*/
while(hashs[i]!=0) /*如果该位置已经存储了数据,即发生了冲突*/
{
i++; /*用线性探测法找后面的位置*/
i%=len; /*如果越界了,将试探数组最开始的位置*/
}
hashs[i]=key;
}
/*在长度为N的数组data中查找关键字key,返回存储数据的位置,-1代表没有找到*/
int search_hash(int hashs[],int len,int key)
{
int i;
i=key%len; /*用除留余数法计算出存储数据的位置*/
while(hashs[i]!=0&&hashs[i]!=key) /*确定的位置不为空,也不是要找的数,这是由当时存数数据时发生过冲突所致*/
{
i++; /*也用线性探测法找后面的位置*/
i%=len; /*如果越界了,将试探数组最开始的位置*/
}
if(hashs[i]==0) /*找到的是空元素,说明没有找到*/
i=-1; /*返回-1将代表没有找到*/
return i; /*返回结果*/
}
- 哈希法,是在工程项目中普遍使用的另外一种快速查找的方法。采用哈希法首先需要确定一个称为哈希函数的计算方法。使用哈希法对数据进行存储和查找,选用哈希函数是个关键 。
- 在工程中,常用直接定址法,平方取中法,折叠法,除留取余法等方法确定哈希函数。
- 要使用哈希法,“地址冲突”首先要解决。解决方法包括开放地址法(线性探测法),再哈希法,链地址法。
- 简介
①.哈希查找的本质是先将数据映射成它的哈希值。哈希查找的核心是构造一个哈希函数,它将原来直观、整洁的数据映射为看上去似乎是随机的一些整数。
②.哈希查找的产生有这样一种背景——有些数据本身是无法排序的(如图像),有些数据是很难比较的(如图像)。如果数据本身是无法排序的,就不能对它们进行比较查找。如果数据是很难比较的,即使采用折半查找,要比较的次数也是非常多的。因此,哈希查找并不查找数据本身,而是先将数据映射为一个整数(它的哈希值),并将哈希值相同的数据存放在同一个位置一即以哈希值为索引构造一个数组。