以关键字除留余数法构建哈希函数H(key)=key MOD p,分别用线性探测再散列LinearConflict()和链地址法LinkConflict()处理冲突的方式来构建哈希表并计算其平均查找长度ASL,其中数据记录的数量n、哈希表的表长m>=n和哈希函数中的p<=m以及每个数据元素的关键字通过键盘或文本文件输入。
#include <opencv.hpp>
#include<stdio.h>
#include<cstdio>
#include<string.h>
#include<stdlib.h>
using namespace cv;
Mat srcImage1(600, 1000, CV_8UC3, Scalar(255, 255, 255));
int p=13;
int H(int key)
{
return key - p * (key / p);
}
typedef struct link {
int numb;
struct link *next;
}LINK;
LINK *P[15];
struct haselink {
LINK *list;
int numb;
}hase_l[15];
int data[13] = { 1,7,34,67,32,56,89,39,48,45,41,87,65};
int hase[15] = { 0 };
int LinkConflict(int hase[],int position)
{
while (1)
{
if (hase[position] != 0)
{
if (position / 14 == 1)
position = 0;
else position++;
}
else return position;
}
}
int ASL()
{
int dis = 0;
for (int i = 0; i < 13; i++)
{
int key= H(data[i]);
while (1)
{
if (hase[key] != 0)
{
if (key / 14 == 1)
key = 0;
else key++;
dis++;
}
else break;
}
}
return dis;
}
int main()//哈希表的链地址是用hase_l表示,线性探测用hase表示
{
for (int i = 0; i < 15; i++)
hase_l[i].list = NULL;
for (int i = 0; i < 13; i++)
{
int key = H(data[i]);
if (hase[key] == 0)
hase[key] = data[i];
else hase[LinkConflict(hase, key)] = data[i];
}
printf("ASL=%d\n",ASL());
for (int i = 0; i < 13; i++)
{
int key = H(data[i]);
if (hase_l[key].list == NULL)
{
hase_l[key].list = (LINK*)malloc(sizeof(LINK));
hase_l[key].list->numb = data[i];
hase_l[key].list->next = (LINK*)malloc(sizeof(LINK));
P[key] = hase_l[key].list->next;
}
else {
P[key]->numb = data[i];
P[key]->next = (LINK*)malloc(sizeof(LINK));
P[key] = P[key]->next;
}
}
return 0;
}
``