7-4 散列表查找(PTA程序设计)
设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时采用平方探测法,使用增量序列di=i* i。计算输入序列(值>=0)对应的散列地址并进行查找,如果有此元素,则输出散列地址,如果无此元素,则输出not found。并输出查找次数(输入个数不会超过15个)
输入格式:
第一行为输入个数;
第二行为对应的输入值,用空格隔开;
第三行为需查找的元素,第1个为查找元素个数,后面为查找元素
输出格式:
第一行依次输出输入序列的散列地址,以一个空格隔开;
第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格),如果无此元素,则输出not found。
输入样例:
5
141 73 95 112 56
7 5 73 95 141 112 56 18
输出样例:
5 6 10 11 9
5 not found,try 4
73 pos:6,try 2
95 pos:10,try 1
141 pos:5,try 1
112 pos:11,try 2
56 pos:9,try 3
18 not found,try 1
代码(Python):
list1=[] #存好的数
list2=[] #用散列表存list1中的数
list3=[] #查找的元素,第1个为查找元素个数,后面为查找元素,即输入样例中的第三行数据
ct=[] #存放try的次数
for i in range(18): #如果这里不赋初值的话,列表为空,下面就会报错list index out of rangelist2.append(0) #这里如果直接写list2[i]=0就会报错list assignment index out of range,一种情况是下标越界,另一种情况是列表为空
n=int(input()) ##一共有几个数
#map()函数是将func作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。
#虽然结果作为list返回,但还是鼓励在外面加上list(),否则可能会有错误
list1=list(map(int,input().split())) #这一行是将一行以空格为分隔的数赋值给列表
for i in range(0,n): #使存在list1中的每个数按要求存入散列表list2d=1 #冲突时采用平方探测法,使用增量序列di=i*i,使d一开始为1j=list1[i]%17 #散列函数是hask(k)=k%17if list2[j]==0: #list为空,在这种情况下使用list[0]便会报错list2[j]=list1[i] #即当散列表该位置还未存入list1中得到数时,使其存入散列表ct.append(d) #try了一次的情况,将try值加入列表ct中else: #否则散列表中已经有了list1中的值,散列冲突while(list2[j]!=0): #用开放地址法解决冲突hi=(h0+di)%m。冲突时采用平方探测法,使用增量序列di=i*ij=(list1[i]%17+d*d)%18 #用冲突前的地址加上增量再取余18,否则将会越界d+=1 #try值加1ct.append(d) #将try值加入列表ct中list2[j]=list1[i] #将list1列表中的该值存入散列表中print(j,end=' ') #依次输出输入序列的散列地址,即输出的第一行数
print() #输出回车
list3=list(map(int,input().split())) #查找的元素,第1个为查找元素个数,后面为查找元素
for i in range(1,len(list3)): #其实是从第2个元素开始的,但下标为1if list3[i] in list1: #先看要找的数在不在list1中pos1=list1.index(list3[i]) #该数在列表1中的下标,目的是用其下标输出ct列表中的try次数pos2=list2.index(list3[i]) #该数在列表2中的下标,目的是输出其位置print("{} pos:{},try {}".format(list3[i],pos2,ct[pos1])) #按要求输出else: #否则要找的数不在list1中m=list3[i]%17 #但也要找其try次数d=1 #try次数开始时为1while list2[m]!=0: #如果其本来应该在list2中的位置不为0的话,说明它可能遇到散列冲突,继续向下一个它应该在的位置m=(list3[i]%17+d*d)%18 #这里一定要除以18取余,否则会越界d+=1 #每判断一次d加1print("{} not found,try {}".format(list3[i],d)) #按要求输出
思路:该题可分为两个步骤,第一步,将数据存入散列表中;第二步,开始在散列表中查找指定元素并输出在散列表里的地址和尝试次数。这里的一个难点就是尝试次数,大家可以看我上面的注释以加以理解。
上面的程序给出了比较详细的注释,以便新手小白参考。程序的思路设计或者代码实现并不是最优的,欢迎各位大佬指正错误或者给出更优质的思路。
我是一只想成为鲲鹏的菜鸟,大家的鼓励是我前进的动力,欢迎大家点赞收藏评论哦!
7-4 散列表查找(PTA程序设计)相关推荐
- 查找 之 散列表查找(哈希表)
基础概念 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).这里对应关系f称为散列函数,又称为哈希(Hash)函数. 采用散列技术将 ...
- 散列表查找——线性探测法
//散列表查找--线性探测法 #include<iostream> #include<stdlib.h> using namespace std; void print(int ...
- 数据结构与算法之hashmap散列表查找
哈希表:关键字.地址与查找 哈希查找是一种常用的查找方式,通常通过自定义函数F(关键字)来实现对于元素的查找,并返回关键字的存储地址(查找成功)或"查找失败"讯息. 散列表不同于线 ...
- 《数据结构与算法》(二十)- 散列表查找
目录 前言 1. 散列表查找(哈希表)概述 1.1 散列表查找定义 1.2 散列表查找步骤 2. 散列函数的构造方法 2.1 直接定址法 2.2 数字分析法 2.3 平方取中法 2.4 折叠法 2.5 ...
- 散列表查找失败平均查找长度
如果你看了很多其他博客然后都看不懂看到了这篇,你一定可以容易懂的!我佛了,这么简单的东西死板地讲题目不讲原理鬼看得懂啊,这种风气真的不行,我忍不住想骂一声垃圾,啥玩意儿,误人子弟!原理懂了啥题不会做? ...
- 散列表查找(哈希表)
散列函数构造经常要考虑: 1.散列表的长度 2.关键字的长度 3.关键字的分布情况 4.计算散列函数所需的时间 5.记录的查找频率 一个"好"的散列函数应遵循一下两条原则 (1)函 ...
- 散列表查找的一个实例
这里解决冲突的方法是开放地址法:"开放地址指的是表中尚未被占用的地址,开放地址法就是当冲突发生时候,形成一个地址序列,沿着这个序列逐个进行探测,直到找到一个空的开放地址,将发生冲突的关键字存 ...
- 散列表查找失败平均查找长度_Python数据结构与算法56:排序与查找:冲突解决方案...
注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为6分钟. 前面说过,如果两个数据项被散列映射到同一个槽,需要一个系统化的方法在散列表中保存第二个数据项,这 ...
- 散列表查找为何如此之快
一.散列函数 散列是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).建立了关键字与存储位置的映射关系,公式如下: 存储位置 =f(关键字) ...
- 散列表查找 (15 分)
设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m.冲突时采用平方探测法,使用增量序列di=i* i.计算输入序列(值>=0)对应的散列地址并进 ...
最新文章
- 【前端笔记】Vuex 是什么,为什么需要
- JSP获得客服端MAC地址
- 使用免费虚拟服务器建站并实现域名解析
- 美团支付平台产品规划
- 嵌入式linux开发考试题目,练一练!3道经典嵌入式Linux面试题,答案在文末。
- 网页设计上机考试原题_Dreamweaver上机考试题目dreamweaver试题库网页制作试题.doc...
- MySQL文件后_MySQL误删除文件后,如何恢复
- 开发人员如何有效的进行数据库设计
- 数据挖掘 -- 分类的模型评估度量
- 素数五个为一行的_对标交流 ▏潍坊市心理咨询师协会名誉理事长、潍坊医学院王力教授一行到昌邑市妇幼保健院指导交流工作...
- mooc中习题--简单运算器
- 少儿编程孩子的学习路线
- 如何修改hosts文件
- 影子之美!太阳日照阴影变化之计算模拟
- c语言的链表ppt,C语言链表详解.ppt
- 线性代数学习笔记——第四十讲——n维向量空间的概念
- 3天实现暴力涨粉500+的引流话术整理!
- layim之刷新群聊列表
- 全球与中国同心管换热器市场市场需求动态及十四五前景展望研究报告2022~2028年
- 免费PPT模板下载(不定时更新)