线性探测再散列解决冲突的哈希表
2010-12-30 13:19
826 查看
今天又完成了一道编程题。此题是用线性探测再散列解决冲突的哈希表设计题。
完成后还是有些困惑,发现自己对算法分析不是特理解。例如,“平均查找长度的上限为2”就不是特别理解。
虽然算法写完了,但是性能不知道有没有题中所说的那样“平均查找长度的上限为2”呢?
希望懂的GG,MM帮忙看下~哦
/*
作者:徐**
日期:12.29 918
Version:v1.0
作用:为班级30个人设计一个Hash表,要求
用除留余数数法构造Hash表,用线性探测再
散列法处理冲突,平均查找长度的上限为2
*/
#include <stdio.h>
#include <string.h>
#define MAX 50
#define STU_MAXNUM 30
#define NULLKEY -1
typedef int KeyType;
typedef struct
{
KeyType key_num;
char name[30];
}RecordType;
typedef RecordType HashTable[MAX];
void Init(HashTable ht)
{
int i;
for(i = 0; i < MAX; i++)
{
ht[i].key_num = NULLKEY;
}
}
int Hash(int key)
{
int mode = key % 13;
return mode;
}
int InsertHash(HashTable ht, RecordType record)
{
int p0 = Hash(record.key_num);
if(ht[p0].key_num == NULLKEY)
{
ht[p0].key_num = record.key_num;
strcpy(ht[p0].name, record.name);
}
else //如果发生冲突,则用线性探测再散列解决冲突
{
int i, pi;
for(i = 1; i <= MAX - 1; i++)
{
pi = (p0 + i) % MAX;
if(ht[pi].key_num == NULLKEY)
{
ht[pi].key_num = record.key_num;
strcpy(ht[pi].name, record.name);
}
}
}
return 1;
}
int Hash_Create(HashTable ht)
{
int count = 0;
RecordType record;
for(count = 0; count < STU_MAXNUM; count++) //产生STU_MAXNUM(30)个学生的记录
{
memset(&record, 0x00, sizeof(record));
printf("Please input a key_num of student : ");
scanf("%d", &(record.key_num));
getchar();
printf("Please input name of this student : ");
gets(record.name);
InsertHash(ht, record);
}
printf("/nCreate Successfully!/n");
return 1;
}
int Hash_Search(HashTable ht, int key)
{
int p0;
p0 = Hash(key);
if(ht[p0].key_num == NULLKEY) return NULLKEY; //如果为空键值,则表示查找失败
else if(ht[p0].key_num == key) return p0;
else //用线性探测再散列法解决冲突
{
int i;
int pi;
for(i = 1; i <= MAX - 1; i++)
{
pi = (p0 + 1) % MAX;
if(ht[pi].key_num == NULLKEY) return NULLKEY;
else if(ht[pi].key_num == key) return pi;
}
}
return NULLKEY;
}
int main()
{
int key = NULLKEY;
HashTable ht;
Init(ht);
Hash_Create(ht);
printf("Please input the key you want Search : ");
scanf("%d", &key);
key = Hash_Search(ht, key);
if(key != NULLKEY)
{
printf("key_num : %d/nname : %s/n", ht[key].key_num, ht[key].name);
}
return 0;
}
完成后还是有些困惑,发现自己对算法分析不是特理解。例如,“平均查找长度的上限为2”就不是特别理解。
虽然算法写完了,但是性能不知道有没有题中所说的那样“平均查找长度的上限为2”呢?
希望懂的GG,MM帮忙看下~哦
/*
作者:徐**
日期:12.29 918
Version:v1.0
作用:为班级30个人设计一个Hash表,要求
用除留余数数法构造Hash表,用线性探测再
散列法处理冲突,平均查找长度的上限为2
*/
#include <stdio.h>
#include <string.h>
#define MAX 50
#define STU_MAXNUM 30
#define NULLKEY -1
typedef int KeyType;
typedef struct
{
KeyType key_num;
char name[30];
}RecordType;
typedef RecordType HashTable[MAX];
void Init(HashTable ht)
{
int i;
for(i = 0; i < MAX; i++)
{
ht[i].key_num = NULLKEY;
}
}
int Hash(int key)
{
int mode = key % 13;
return mode;
}
int InsertHash(HashTable ht, RecordType record)
{
int p0 = Hash(record.key_num);
if(ht[p0].key_num == NULLKEY)
{
ht[p0].key_num = record.key_num;
strcpy(ht[p0].name, record.name);
}
else //如果发生冲突,则用线性探测再散列解决冲突
{
int i, pi;
for(i = 1; i <= MAX - 1; i++)
{
pi = (p0 + i) % MAX;
if(ht[pi].key_num == NULLKEY)
{
ht[pi].key_num = record.key_num;
strcpy(ht[pi].name, record.name);
}
}
}
return 1;
}
int Hash_Create(HashTable ht)
{
int count = 0;
RecordType record;
for(count = 0; count < STU_MAXNUM; count++) //产生STU_MAXNUM(30)个学生的记录
{
memset(&record, 0x00, sizeof(record));
printf("Please input a key_num of student : ");
scanf("%d", &(record.key_num));
getchar();
printf("Please input name of this student : ");
gets(record.name);
InsertHash(ht, record);
}
printf("/nCreate Successfully!/n");
return 1;
}
int Hash_Search(HashTable ht, int key)
{
int p0;
p0 = Hash(key);
if(ht[p0].key_num == NULLKEY) return NULLKEY; //如果为空键值,则表示查找失败
else if(ht[p0].key_num == key) return p0;
else //用线性探测再散列法解决冲突
{
int i;
int pi;
for(i = 1; i <= MAX - 1; i++)
{
pi = (p0 + 1) % MAX;
if(ht[pi].key_num == NULLKEY) return NULLKEY;
else if(ht[pi].key_num == key) return pi;
}
}
return NULLKEY;
}
int main()
{
int key = NULLKEY;
HashTable ht;
Init(ht);
Hash_Create(ht);
printf("Please input the key you want Search : ");
scanf("%d", &key);
key = Hash_Search(ht, key);
if(key != NULLKEY)
{
printf("key_num : %d/nname : %s/n", ht[key].key_num, ht[key].name);
}
return 0;
}
相关文章推荐
- SDUT 3379 数据结构实验之查找七:线性之哈希表(线性探测法解决冲突)
- 数据结构实验之查找七:线性之哈希表(线性探测解决哈希表的冲突)
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 哈希表冲突的两个解决方法线性探测和分离链接法
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 哈希表开放寻址法之线性探测法解决冲突问题
- 哈希冲突的处理【闭散列方法-线性探测和二次探测】
- 第5天:散列HASH(二)冲突解决办法之线性再散列法
- hash线性探测开放定址法解决冲突
- 第十五周项目2 利用线性探测解决哈希冲突
- 哈希表(线性探测再散列)
- 实验 哈希表线性探测再散列
- 哈希冲突的处理【闭散列方法-线性探测和二次探测】
- 散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
- 哈希散列冲突线性探测再散列算法
- 平方探测和线性探测解决散列表冲突的区别(优点及缺点)
- 建立Hash表(散列表)(运用线性探测法解决冲突)
- 一个简单的哈希表(线性探测再散列)
- 数据结构--解决散列冲突,平方探测法
- 处理哈希冲突的闭散列方法-线性探测