开放定址法构造哈希表

#define NULLKEY -1
#define DELKEY -2
typedef int KeyType;
typedef struct {
	KeyType key;
	int count;//探测次数域
}HashTable;

  

void InsertHT(HashTable HT[], KeyType k, int& n, int m, int p)
{
	//n哈希表中总元素的个数,m表长
	int i, adr;
	adr = k % p;
	if (HT[adr].key == NULLKEY || HT[adr].key == DELKEY)
	{
		HT[adr].key = k;
		HT[adr].count = 1;
	}
	else
	{
		i = 1;
		do {
			adr = (adr + 1) % m;//是m不是p
			i++;
		} while (HT[adr].key != NULLKEY && HT[adr].key != DELKEY);
		HT[adr].key = k;
		HT[adr].count = i;
	}
	n++;
}

  

void CreateHT(HashTable HT[], KeyType keys[], int& n, int m, int p,int n1)
{
	//n1为keys数组长度
	int i;
	for ( i = 0; i < m; i++)
	{
		HT[i].key = NULLKEY;
		HT[i].count = 0;
	}
	n = 0;
	for (i = 0; i < n1; i++)
		InsertHT(HT, keys[i], n, m, p);
}

  

bool DeletHT(HashTable HT[], KeyType k, int& n, int m, int p)
{
	int adr = k % p;
	while (HT[adr].key != NULLKEY && HT[adr].key != k)
		adr = (adr + 1) % m;
	if (HT[adr].key == k)
	{
		HT[adr].key = DELKEY;
		return true;
	}
	else
		return false;
}

  

void SerachHT(HashTable HT[], KeyType k, int& n, int m, int p)
{
	int i = 1;
	int adr = k % p;
	while (HT[adr].key != NULLKEY && HT[adr].key != k)
	{
		adr = (adr + 1) % m;
		i++;
	}
	if (HT[adr].key == k)
		printf("成功:关键字%d,比较%d次\n", k, i);
	else
		printf("失败:关键字%d,比较%d次\n", k, i);
}

  

void ASL(HashTable HT[], int n, int m, int p)
{
	int i, j, s;
	int suc = 0,unsuc = 0;
	for (i = 0; i < m; i++)
	{
		if (HT[i].key != NULLKEY)
			suc += HT[i].count;
	}
	printf("成功情况下ASL=%g\n", suc * 1.0 / n);
	for (i = 0; i < p; i++)
	{
		s = 1;
		j = i;
		while (HT[j].key != NULLKEY)
		{
			s++;
			j = (j + 1) % m;
		}
		unsuc += s;
	}
	printf("失败情况下ASL=%g\n", unsuc * 1.0 / p);
}

  测试用例:KeyType keys[] = { 16,74,60,43,54,90,46,31,29,88,77 },int p = 13, m = 13, n = 0, n1 = 11;

原文地址:https://www.cnblogs.com/KIROsola/p/11986689.html

时间: 2024-10-09 22:51:37

开放定址法构造哈希表的相关文章

哈希表(开放定址法处理冲突)(1013)

Description 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用开放定址法的线性探测. Input 第一行为哈希表的长度n: 第二行为关键字的个数: 第三行为关键字集合: 第三行为要查找的数据. Output 如果查找成功,输出关键字所哈希表中的地址和比较次数:如果查找不成功,输出-1. 如果查找成功,输出关键字所哈希表中的地址和比较次数:如果查找不成功,输出-1. Sample Input   1 2 3 4 5 13 11 16 74 60 43 54 9

C# Dictionary源码剖析---哈希处理冲突的方法有:开放定址法、再哈希法、链地址法、建立一个公共溢出区等

参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/wangjun1234/p/3719635.html 源代码版本为 .NET Framework 4.6.1 Dictionary是Hashtable的一种泛型实现(也是一种哈希表)实现了IDictionary泛型接口和非泛型接口等,将键映射到相应的值.任何非 null 对象都可以用作键.使用与Hashtable不同的冲突解决方法,D

C++链地址法实现哈希表

哈希表,也叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做哈希函数,存放记录的数组叫做哈希表. 哈希函数最主要的设计在于哈希函数和冲突处理的解决,其中哈希函数的设计方法主要有直接定址法和除留余数法:冲突处理的方法主要有开放定址法和链地址法.本文主要实现了一个基本存放字符串的哈希表,冲突处理采用链地址法. 代码如下: #include <iostream> #include<c

数据结构--开放定址法解决散列冲突时几种探测法的比较

开放定址法解决散列冲突时主要有线性探测法,平方探测法和双散列法,以下代码通过插入大量随机数,来统计几种探测法产生冲突的次数. #include<iostream> using namespace std; #define MinTablesize 10 #define Num 3000 typedef unsigned int Index; typedef Index Position; struct Hashtal; typedef struct Hashtal *Hashtable; in

算法学习 - HashTable开放地址法解决哈希冲突

开放地址法解决哈希冲突 线性开放地址法 线性开放地址法就是在hash之后,当发现在位置上已经存在了一个变量之后,放到它下一个位置,假如下一个位置也冲突,则继续向下,依次类推,直到找到没有变量的位置,放进去. 平方开放地址法 平方地址法就是在hash之后,当正确位置上存在冲突,不放到挨着的下一个位置,而是放到第2^0位置,假如继续冲突放到2^1的位置,依次2^3... 直到遇到不冲突的位置放进去. 双散列开放地址法 双散列同上,不过不是放到2^的位置,而是放到key - hash(key, tab

数据结构之散列(开放定址法)

1 // OHash 2 // 关键字:int 3 // Hash函数:hash(X) = X mod TableSize 4 // 冲突解决方法:开放定址法.Index(X, i) = (hash(X) + f(i)) mod TableSize, f(0) = 0 5 // 其中f(i)为: 6 // 1. 线性, f(i) = i 7 // 2. 平方, f(i) = i ^ 2 8 // 3. 双散列, f(i) = i * hash2(X), hash2(X, R) = R - (X

散列表的C语言实现-开放定址法

头文件: #ifndef __HASHTABLE_H #define __HASHTABLE_H /*********************(平方)开放定址散列法***************/ //如果有冲突发生,那么就尝试另外的单元,直到找到空的单元为止 typedef unsigned int index; typedef index position; typedef int ElementType; #define MINTABLESIZE 5 struct hashTable; t

数据结构(Java语言)——HashTable(开放定址法)简单实现

分离链接散列算法的缺点是使用一些链表.由于给新单元分配地址需要时间,因此这就导致算法的速度有些减慢,同时算法实际上还要求对第二种数据结构的实现.另有一种不用链表解决冲突的方法是尝试另外一些单元,直到找出空的单元为止.更常见的是,单元h0(x),h1(x),h2(x),...相继被试选,其中hi(x)=(hash(x)+f(i)) mod TableSize,且f(0)=0.函数f是冲突解决方法,因为所有的数据都要置于表内,所以这种解决方案所需要的表要比分离链接散列的表大.一般来说,对于不使用分离

算法:开放定址法散列表

hash.h #ifndef _HASHQUAD_H #define _HASHQUAD_H #define MinTableSize 10 struct HashEntry; struct HashNode; typedef char *ElementType; typedef unsigned int Index; typedef Index Position; typedef struct HashNode *HashTable; typedef struct HashEntry *Cel