(機考)哈希表的生成與查找(二次探測再散列)


問題描述

空表開始,將輸入元素按照輸入順序逐個插入個哈希表生成哈希表。之后查找元素輸出探測序列輸出查找過程中經過的結點的數據。表長為m,哈希函數為Hash(key)=key mod P (P<=m),用二次探測再散列法處理沖突,即探測序列為Hi=(Hash(key)+di) mod m,其中增量序列為di = 12, -12, 22, -22,32,-32 …, k2, -k2 (km/2)

輸入說明

第一行三個整數nmPn輸入元素的個數,m為哈希表的表長,P為哈希函數Hash(key)=key mod PP第二行n個整數,為輸入數據后面每一行是一個要查找的整數-1結束。最后-1不查找

輸出說明

對於每個要查找的數字一行上輸出探測序列輸出查找過程中經過的結點的數據中間以空格隔開。對於哈希表中不存在的數字,探測到最后一個空位置時,要輸出字符串“NULL”。每個數字的探測序列后面換行

輸入樣例

11 14 13

62 42 53 69 100 26 87 74 56 61 48

48

30

8

56

87

61

35

-1

輸出樣例

100 62 87 74 56 69 26 61 48

69 56 42 87 26 74 100 NULL

87 100 48 NULL

69 56

100 62 87

100 62 87 74 56 69 26 61

#include <stdio.h>

int m,n,P;
int *list;

int search(int x,bool print)
{
	int h,hi;
	h=hi=x%P;
	for (int i=2;i<=m/2*2+2;i++)
	{
		if (list[hi]==x || list[hi]==-1)
			break;
		if (print)
			printf("%d ",list[hi]);
		if (i%2==0)
			hi=(h+(i/2)*(i/2))%m;
		else
			hi=((h-(i/2)*(i/2))%m+m)%m;
	}
	if (print)
	{
		if (list[hi]==-1)
			printf("NULL\n");
		if (list[hi]==x)
			printf("%d\n",x);
	}
	return hi;
}

void insert(int x)
{
	int location;
	location=search(x,0);
	if (list[location]==x)
		return;
	if (list[location]==-1)
		list[location]=x;
	else 
		printf("Table FULL!\n");
	
}
int main()
{
	int i,x;
	scanf("%d%d%d",&n,&m,&P);
	list=new int[m];
	for (i=0;i<m;i++)
		list[i]=-1;

	for (i=0;i<n;i++)
	{
		scanf("%d",&x);
		insert(x);
	}
/*
	printf("List is: ");
	for (i=0;i<m;i++)
		printf("%d ",list[i]);
	printf("\n");
*/
	for(;;)
	{
		scanf("%d",&x);
		if (x==-1)
			return 0;
		search(x,1);
	}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM