数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)
数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)
/*search-hash*/
#include<math.h>
#include<stdio.h>
#include<stdlib.h>void Print(int *a){int i;printf("\n");for(i=1;i<=a[0];++i)printf("%4d",a[i]);
}/*Print*/int formatlist(){
int e;
printf("\n====创建哈希表========");
printf("\n1-线性探查法 ");
printf("\n2-二次探查法");
printf("\n0-退出");
printf("\n请你选择:");
scanf("%d",&e);
return e;
}/*formatlist*/void hashprint(int *hashtable){int i;/*打印哈希表*/for(i=0;i<19;++i){ if(hashtable[i]!=-1)printf("\n[%d]=%d",i,hashtable[i]);}
}/*hashprint*//*构造哈希表*/
void createhash(int *hashtable,int *collision){int i ,e,hkey,d,k=1;/*哈希表初始化*/for (i=0;i<19;++i) hashtable[i]=-1; printf("\n请输入数值(exit for 0):");scanf("%d",&e);while(e!=0&&k<=19){hkey=e%13;d=hkey;i=1;while(hashtable[d]!=-1){ if (hashtable[d]!=e && i<=collision[0])d=(hkey+collision[i++])%19;else if (hashtable[d]==e){ printf("数据重复!");k--;break;}else if(i>collision[0]){printf("冲突次数太多!");exit(0);}}/*while*/if (hashtable[d]==-1) hashtable[d]=e;printf("\n请输入数值(exit for 0):");scanf("%d",&e);k++;}/*while*/if (k>19) printf("空间满了!"); /*输入的数据超过所分配的空间*/
}/*createhash*//*哈希表中进行查找*/
int searchhash(int *hashtable,int *collision,int e){ int hkey,d,i;hkey=e%13;d=hkey;i=1;while(hashtable[d]!=e && hashtable[d]!=-1 && i<=collision[0])d=(hkey+collision[i++])%19;if (hashtable[d]==e ){printf("\n数据:%d=被找到 , 地址: [%d],t探测次数:%d. ",e,d,i);return 1;}else { printf("\n数据没有找到.\n");return 0;}
}/*search*//*插入哈希表中*/
void hashinsert(int *hashtable,int *collision,int e){int i,hkey,d;hkey=e%13;d=hkey;i=1;while(hashtable[d]!=-1){ if (hashtable[d]!=e && i<=collision[0])d=(hkey+collision[i++])%19;else if(i>collision[0]){printf("冲突次数太多!");exit(0);}}/*while*/if (hashtable[d]==-1){hashtable[d]=e;printf("\n元素被插入!");hashprint(hashtable);}
}/*createhash*/int main(){int hashtable[19], prode[19],secondprode[19];int i,j=1;int k=0,e,values;/*线形探测再散列增量表初始化*/for (i=1;i<=18;++i) prode[i]=i; prode[0]=i-1;/*二次线形探测再散列增量表初始化*/for(i=1;i<=18&&j<=9;++i){ secondprode[i]=pow((double)(-1),(i+1)) * pow((double)(j),2);k++;if (k==2) { j++;k=0;}}secondprode[0]=i-1;Print(prode);Print(secondprode);while(1){e=formatlist();if (e==0) break;switch(e){case 1:{/*用线形探测再散列构造哈希表*/ createhash(hashtable,prode);break;}case 2:{/*用二次线形探测再散列构造哈希表*/createhash(hashtable,secondprode);break;}default:printf("your input is error!");}/*switch*/hashprint(hashtable);while(1){printf("\n请输入你想查找的数据(exit for -1):");scanf("%d",&values);if (values==-1) break;switch(e){case 1:if (!searchhash(hashtable,prode,values)) /*哈希表查找*/hashinsert(hashtable,prode,values); /*查找不成功则插入该元素*/break;case 2:if (!searchhash(hashtable,secondprode,values))hashinsert(hashtable,secondprode,values); /*用二次线形探测再散列构造哈希表*/break;default:printf("你的输入错误!");}/*switch*/}/*while*/
}/*while*/system("pause");exit(0);
}/*main*/
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 181 -1 4 -4 9 -9 16 -16 25 -25 36 -36 49 -49 64 -64 81 -81
====创建哈希表========
1-线性探查法
2-二次探查法
0-退出
请你选择:1请输入数值(exit for 0):26请输入数值(exit for 0):36请输入数值(exit for 0):41请输入数值(exit for 0):38请输入数值(exit for 0):44请输入数值(exit for 0):15请输入数值(exit for 0):68请输入数值(exit for 0):12请输入数值(exit for 0):6请输入数值(exit for 0):51请输入数值(exit for 0):25请输入数值(exit for 0):0[0]=26
[2]=41
[3]=15
[4]=68
[5]=44
[6]=6
[10]=36
[12]=38
[13]=12
[14]=51
[15]=25
请输入你想查找的数据(exit for -1):25数据:25=被找到 , 地址: [15],t探测次数:4.
请输入你想查找的数据(exit for -1):26数据:26=被找到 , 地址: [0],t探测次数:1.
请输入你想查找的数据(exit for -1):41数据:41=被找到 , 地址: [2],t探测次数:1.
请输入你想查找的数据(exit for -1):68数据:68=被找到 , 地址: [4],t探测次数:2.
请输入你想查找的数据(exit for -1):44数据:44=被找到 , 地址: [5],t探测次数:1.
请输入你想查找的数据(exit for -1):6数据:6=被找到 , 地址: [6],t探测次数:1.
请输入你想查找的数据(exit for -1):36数据:36=被找到 , 地址: [10],t探测次数:1.
请输入你想查找的数据(exit for -1):38数据:38=被找到 , 地址: [12],t探测次数:1.
请输入你想查找的数据(exit for -1):12数据:12=被找到 , 地址: [13],t探测次数:2.
请输入你想查找的数据(exit for -1):51数据:51=被找到 , 地址: [14],t探测次数:3.
请输入你想查找的数据(exit for -1):
数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)相关推荐
- 数据结构与算法——17. 散列(哈希)与完美散列函数
文章目录 一.散列(Hashing)的概念 举例说明 二.完美散列函数 1. 数据的一致性校验 2. 完美散列函数用于数据的一致性校验 一.散列(Hashing)的概念 在查找算法中,如果数据项之间是 ...
- 数据结构之查找算法:散列查找
查找算法:散列查找 思维导图: 散列函数和散列表: 构造散列函数的要求: 构造散列函数的方法: 直接定址法: 除留取余法: 数字分析法: 平方取中法: 折叠法: 解决冲突的方法: 开放定址法: 线性探 ...
- 数据结构(六)散列查找 —— 编程作业01 :电话聊天狂人
数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总. 题目描述: 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N( ...
- “查找”学习提纲(二)——树型查找和散列查找
文章目录 前言 代码模板 二叉排序/查找/搜索树查找 适用 性能 代码模板 折半查找和二叉排序树查找总结 平衡二叉(排序)树/AVL树 构造相应层数的树至少需要的结点数 平衡调整的过程 平衡调整的类型 ...
- 查找算法【哈希表】 - 散列查找及性能分析
查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...
- PTA数据结构题目集 第十一周——散列查找
目录 11-散列1 电话聊天狂人 (25分) 思路 代码 测试点 11-散列2 Hashing (25分) 思路 代码 测试点 11-散列3 QQ帐户的申请与登陆 (25分) 题目大意 思路 代码 测 ...
- 数据结构和算法系列13 五大查找之哈希查找
原文地址 http://www.cnblogs.com/mcgrady/p/3294871.html 数据结构和算法系列13 五大查找之哈希查找 这一篇要总结的是五天查找的最后一篇,哈希查找,也称为散 ...
- 【数据结构与算法】比较法分析查找算法与查找结构
基本的查找技术: 线性表的查找技术 顺序查找 分块查找 二分查找(折半查找) 插值查找 树表的查找技术 二叉排序树 平衡二叉树 B树(B+树.B-树等) 散列表的查找技术 开散列表 闭散列表 顺序查找 ...
- 哈希表(散列查找)(c/c++)
通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置.一般来讲,为了进行高效率的查找,要求哈希函数简单均匀.空间利用率高.关键字之间的冲突少. 关于散列查找的实现需要着重考 ...
最新文章
- MVC的增删改和Razor
- freeRtos学习笔(4)消息队列
- php 权限管理对节点控制,我对权限控制系统的看法_php
- openstack API debug OpenstackEveryProject_CLI,curl_based
- 连接池超时配置_HttpClient连接池的一些思考
- pg订阅oracle修改,PostgreSQL修改数据库timezone
- Nodejs中puppeteer通过Event抓取HAR数据
- 什么是servlet?servlet的运行原理?如何自定义一个servlet?
- movielens电影数据分析
- 【台达 PLC - 1】 - 编程软件(WPL)
- p2p网络中的节点发现之UDP
- EasyMicroPlot: 一种快速进行微生物下游分析的整合R包
- JavaSE编码实操
- mui 悬浮窗口实现
- 交通领域主要SCI期刊——2017年JCR
- 生日祝福代码python_Python|送给朋友的生日祝福
- 三菱无机房电梯故障代码查询_三菱无机房ELENESSA电梯故障代码表
- 数学定义随机变量、概率密度函数、分布函数
- ECL模型与评级简介 |国庆不容错过的内容⑦
- 调度算法——先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN) 例题详细!!!