采用线性探测再散列的方法处理冲突

1 题目

功能:哈希查找描述: 哈希表长度 11 哈希函数 (key)=key%11 采用线性探测再散列的方法处理冲突

2 思路

哈希函数简要介绍

哈希函数的构造方法

哈希函数的构造方法常用的有5种,分别是数字分析法、平方取中法、分段叠加、伪随机数法和余数法,其中余数法比较常用。例子中已给出哈希函数,按照给出的哈希函数进行了构造

避免哈希冲突的方法

分别有开放定址法(包括线性探测再散列和二次探测再散列入、链地址法、再哈希法和建立公共溢出区开放定址法中的线性探测再散列比较常用,该方法的特点是在冲突发生时,顺序查看表中的下一单元,直到找出一个空单元或査遍全表。

3 代码

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define Max 11

#define N 8

/**

功能:哈希查找

描述:

  哈希表长度 11

  哈希函数 (key)=key%11

  采用线性探测再散列的方法处理冲突

**/

inthashtable[Max];

intfunc(intvalue) {

returnvalue%Max;              // 哈希函数

}

intsearch(intkey) {                // 自定义函数实现哈希查询

intpos,t;

pos=func(key);              // 哈希函数确定出的位置

t=pos;                    // t存放确定出的位置

while(hashtable[t]!=key&&hashtable[t]!=-1) {

    // 如果该位置上不等于要查找的关键字且不为空

t=(t+1)%Max;            // 利用线性探测求出下一个位置

if(pos==t)

      // 如果经多次探测又回到原来用哈希函数求出的位置则说明要查找的数不存在

return-1;

   }

if(hashtable[t]==-1)          // 如果探测的位置是-1则说明要查找的数不存在

return-1;

else

returnt;

}

voidcreathash(intkey) {            // 自定义函数创建哈希表

intpos,t;

pos=func(key);                // 哈希函数确定元素的位置

t=pos;

while(hashtable[t]!=-1) {

    // 如果该位置有元素存在则进行线性探测再散列

t=(t+1)%Max;

if(pos==t) {

  // 如果冲突处理后确定的位置与原位置相同则说明哈希表已满

printf("哈希表已满\n");

return;

       }

   }

hashtable[t]=key;              // 将元素放入确定的位置

}

intmain(intargc,charconst*argv[]) {

intflag[50];

inti,j,t;

for(i=0;i<Max;i++)

hashtable[i]=-1;        // 哈希表中初始位置全置-1


for(i=0;i<50;i++)

flag[i]=0;

                  // 50以内所有数未产生时均标志为0

srand((unsignedlong)time(0));    // 利用系统时间做种子产生随机数

i=0;

printf("建立 Hash 表: \n");

while(i!=N) {

t=rand()%50;        // 产生一个50以内的随机数赋给t

if(flag[t]==0) {          // 查看t是否产生过

creathash(t);          // 调用函数创建哈希表

printf("%2d:",t);        // 将该元素输出

for(j=0;j<Max;j++)

printf("(%2d) ",hashtable[j]);

                // 输出哈希表中内容

printf("\n");

flag[t]=1;          // 将产生的这个数标志为1

i++;                // i自加

       }

   }

printf("请输入你想查找的元素:");

scanf("%d",&t);            // 输入要查找的元素

if(t>0&&t<50) {

i=search(t);              // 调用search进行哈希查找

if(i!=-1)

printf("查找成功!其位置是:%d\n",i);  // 若查找到该元素则输出其位置

else

printf("查找失败!");          // 未找到输出提示信息

   }

else

printf("输入有误!");

}

示例结果:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容