查找之Hash查找

来源:互联网 发布:金马甲网络交易平台 编辑:程序博客网 时间:2024/05/22 12:58

/*
名称:Hash查找
说明:Hash查找本质上就是把元素的关键字和元素的存储位置建立了一个映射联系,这样使得元素可以通过关键字立即查找到相应位置。这是最快的查找方式。但是在进行映射时有两个问题需要解决:
1、哈希函数的构造(映射函数)
一般来说,哈希函数有以下几种常用的构造方式
(1)、直接定址法
(2)、除留余数法
(3)、数字分析法
(4)、平方取中法
(5)、折叠法

其中前两种用的稍微多些。(至少目前我是这样认为的) 而且对于前两种方法,还可以把元素进行线性搬移。后三种方法主要是根据关键字的特征进行映射的。本程序用的是第二种
方式。

2、冲突的处理
对于冲突的处理,主要有以下两种方式;
(1)、开放地址法
其中又分为以下几种方式:
(a)、线性探测法
(b)、平方探测法
(c)、再散列法
(d)、伪随即数列法

(2)、拉链法:即把hash值相同的放到一个链表中。

*/

#include<iostream>#include<vector>#include<cstring>#define MAXSIZE 16using namespace std;//哈希表结构typedef struct Hash{    int * hash_table;    int _count;}Hash;//初始化hash表void InitHash(Hash *_hash){    _hash->_count = 0;    _hash->hash_table = new int[MAXSIZE];    //初始化为0    memset(_hash->hash_table,0,sizeof(int)*MAXSIZE);}//处理冲突,如果散列表已满返回-1,否则返回插入的位置int DealWithCon(Hash *_hash,int key){    if(_hash->_count >= MAXSIZE)        return -1;    else    {        int index = key % (MAXSIZE-1);    //散列函数(除留余数法)       //int index = key % (13);        //线性探测法,每次冲突后探测下一个位置        while(_hash->hash_table[index % (MAXSIZE-1)] != 0)            ++index;        return index % (MAXSIZE-1);    }}//散列表插入void InsertHash( int elem[],int n, Hash * _hash){    int index = 0;    int key = 0;    for(int i = 0;i<n;++i)    {        key = elem[i];        index = key % (MAXSIZE-1);       if(_hash->hash_table[index] != 0)       {           if((index =  DealWithCon(_hash,key)) == -1)                cout<<"inset failed\n";            else                 _hash->hash_table[index] = key;       }       else            _hash->hash_table[index] = key;    }}//在Hash表中查找,查找成功返回其在hash表中的位置,否则返回-1int SearchHash(Hash * _hash,int key){    int index = key % (MAXSIZE-1);    while(index <= MAXSIZE -1 )    {        if(_hash->hash_table[index] == key)            return index;        else if(_hash->hash_table[index] == 0)            return -1;        else            ++index;    }    return -1;}int main(){    Hash ex_table;    InitHash(&ex_table);    int n = 0,val = 0;    int elem[20];    //输入元素    cin>>val;    while(val != -1 )    {        elem[n++] = val;        cin>>val;    }    InsertHash(elem,n,&ex_table);    while(1)    {        cout<<"please input data you want to search: ";        cin>>val;        int ret_flag = SearchHash(&ex_table,val);        if(ret_flag != -1)            cout<<"pos: "<<ret_flag<<endl;        else            cout<<"search failed"<<endl;    }  return 0;}
原创粉丝点击