概述
哈希表查找的思想就是,用哈希函数对每个数据根据键值直接计算出存储位置,这样查找时就不需要逐个比对。
哈希查找的重点就是哈希函数的选择以及冲突的处理,不同选择会影响查找的速度。
例子
哈希函数:addr = key%m
冲突处理:(addr+1)%m
#include<iostream>
using namespace std;
#define HASHSIZE 20
#define NULLKEY -12345
typedef struct
{
int* elem;
int count;
}HashTable;
int m = 0;
//初始化哈希表
bool InitHashTable(HashTable *H)
{
m = HASHSIZE;
H->count = m;
H->elem = (int*)malloc(m * sizeof(int));
for (int i = 0; i < m; i++)
H->elem[i] = NULLKEY;
return true;
}
//哈希函数
int Hash(int key)
{
return key % m;
}
//哈希表插入
void InsertHash(HashTable* H, int key)
{
int addr = Hash(key);
while (H->elem[addr] != NULLKEY)
addr = Hash(addr + 1);
H->elem[addr] = key;
}
//哈希查找
bool SearchHash(HashTable H, int key)
{
int addr = Hash(key);
while (H.elem[addr] != key)
{
addr = Hash(addr + 1);
if (H.elem[addr] == NULLKEY || addr == Hash(key))
return false;
}
return true;
}
int main()
{
HashTable H;
InitHashTable(&H);
int key = 21;
int a[10] = { 1,2,3,4,5,6,7,8,21,22 };
for (int i = 0; i < 10; i++)
InsertHash(&H, a[i]);
cout << "查找" << key << endl;
if (SearchHash(H, key))
cout << "成功" << endl;
else
cout << "失败" << endl;
return 0;
}