数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)

/*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):

数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)相关推荐

  1. 数据结构与算法——17. 散列(哈希)与完美散列函数

    文章目录 一.散列(Hashing)的概念 举例说明 二.完美散列函数 1. 数据的一致性校验 2. 完美散列函数用于数据的一致性校验 一.散列(Hashing)的概念 在查找算法中,如果数据项之间是 ...

  2. 数据结构之查找算法:散列查找

    查找算法:散列查找 思维导图: 散列函数和散列表: 构造散列函数的要求: 构造散列函数的方法: 直接定址法: 除留取余法: 数字分析法: 平方取中法: 折叠法: 解决冲突的方法: 开放定址法: 线性探 ...

  3. 数据结构(六)散列查找 —— 编程作业01 :电话聊天狂人

    数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总.   题目描述: 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人.   输入格式: 输入首先给出正整数N( ...

  4. “查找”学习提纲(二)——树型查找和散列查找

    文章目录 前言 代码模板 二叉排序/查找/搜索树查找 适用 性能 代码模板 折半查找和二叉排序树查找总结 平衡二叉(排序)树/AVL树 构造相应层数的树至少需要的结点数 平衡调整的过程 平衡调整的类型 ...

  5. 查找算法【哈希表】 - 散列查找及性能分析

    查找算法[哈希表] - 散列查找及性能分析 散列表虽然建立了关键字和存储位置之间的直接映像,但冲突不可避免,在散列表的查找过程中,有的关键字可以通过直接定址1次比较找到,有的关键字可能仍然需要和若干关 ...

  6. PTA数据结构题目集 第十一周——散列查找

    目录 11-散列1 电话聊天狂人 (25分) 思路 代码 测试点 11-散列2 Hashing (25分) 思路 代码 测试点 11-散列3 QQ帐户的申请与登陆 (25分) 题目大意 思路 代码 测 ...

  7. 数据结构和算法系列13 五大查找之哈希查找

    原文地址 http://www.cnblogs.com/mcgrady/p/3294871.html 数据结构和算法系列13 五大查找之哈希查找 这一篇要总结的是五天查找的最后一篇,哈希查找,也称为散 ...

  8. 【数据结构与算法】比较法分析查找算法与查找结构

    基本的查找技术: 线性表的查找技术 顺序查找 分块查找 二分查找(折半查找) 插值查找 树表的查找技术 二叉排序树 平衡二叉树 B树(B+树.B-树等) 散列表的查找技术 开散列表 闭散列表 顺序查找 ...

  9. 哈希表(散列查找)(c/c++)

    通过哈希表进行查找的特点是:不需要比较关键字,而是通过哈希函数计算出关键字的位置.一般来讲,为了进行高效率的查找,要求哈希函数简单均匀.空间利用率高.关键字之间的冲突少. 关于散列查找的实现需要着重考 ...

最新文章

  1. MVC的增删改和Razor
  2. freeRtos学习笔(4)消息队列
  3. php 权限管理对节点控制,我对权限控制系统的看法_php
  4. openstack API debug OpenstackEveryProject_CLI,curl_based
  5. 连接池超时配置_HttpClient连接池的一些思考
  6. pg订阅oracle修改,PostgreSQL修改数据库timezone
  7. Nodejs中puppeteer通过Event抓取HAR数据
  8. 什么是servlet?servlet的运行原理?如何自定义一个servlet?
  9. movielens电影数据分析
  10. 【台达 PLC - 1】 - 编程软件(WPL)
  11. p2p网络中的节点发现之UDP
  12. EasyMicroPlot: 一种快速进行微生物下游分析的整合R包
  13. JavaSE编码实操
  14. mui 悬浮窗口实现
  15. 交通领域主要SCI期刊——2017年JCR
  16. 生日祝福代码python_Python|送给朋友的生日祝福
  17. 三菱无机房电梯故障代码查询_三菱无机房ELENESSA电梯故障代码表
  18. 数学定义随机变量、概率密度函数、分布函数
  19. ECL模型与评级简介 |国庆不容错过的内容⑦
  20. 调度算法——先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN) 例题详细!!!

热门文章

  1. java接口作为参数_JAVA:将类、抽象类、接口当成方法的参数传入
  2. 计蒜客 手拉手 调和级数
  3. 114啦网址导航1.13版如何修改LOGO大小-【超级简单】。
  4. tp6 项目的创建与多应用
  5. PTA-实验五-圆形体体积计算器
  6. 自动化运维平台Spug之板块-批量执行 介绍
  7. VS2017字体设置
  8. 干法读书心得:第一章 7、坚持“愚直地、认真地、诚实地”工作
  9. GBase 8a 监控配置
  10. Photoshop学习(二十三):文字凸起效果