20172314 三种查找算法练习
Posted yiyiyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172314 三种查找算法练习相关的知识,希望对你有一定的参考价值。
课程:《程序设计与数据结构》
班级: 1723
姓名: 方艺雯
学号: 20172314
实验教师:王志强
测试日期:2018年10月19日
必修/选修: 必修
错误原因分析
- 散列查找不需要排序,而我是对排序之后的数求H(k)。
- 散列查找中ASL不会求。
- 散列查找中时间太紧急漏了一个数。
题目分析
常见的哈希函数
直接定址法
取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。
除留余数法
设散列表中允许的地址数为m,取一个不大于m,但接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) = key % p ,即对p取余数。
平方取中法
假设关键字是1234,那么它的平方就是1522756,再抽取中间的3位就是227作为散列地址;再比如关键字是4321,那么它的平方就是18671041,抽取中间的3位就可以是671或者710用作散列地址。
折叠法
折叠法是将关键字从左到右分割成位数相等的几部分(注意:后一部分位数不够时可以短些),然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。比 如:关键字是9876543210,散列表表长为三位,我们将它分成四组987|654|321|0|,然后将它们叠加求987+654+321+0=1962,再求后3位得到散列地址为962。有时可能 这还不能够保证分布均匀,不妨从一段向另一端来回折叠后对齐相加。比如将987和321反转,再与654和0相加,编程789+654+123+0=1566,此时的散列地址为566。
随机数法
选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key) = random(key),其中 random为随机数函数。
数学分析法
分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
处理冲突
- 一旦发生冲突,就去寻找下 一个空的散列表地址,只要散列表足够大,空的散列地址总能找到。
- 线性探查法
- 对给出的一组数用哈希函数计算得到位置,遇到冲突时,查看紧随其后的下一个,如还是冲突,继续,直到找到空位。
- 对于ASL,它是指插入元素时的比较次数。
- 二次探查法
- 在遇到冲突时, 使用函数Hi = (H0 + i^2)%m, Hi = (H0 - i^2)%m, i = 1,2,3…来查找空位,而不是查看紧随其后的下一个。
- 链接地址法
- 同以上的区别就是,在遇到冲突时,排在同一位置的下一个元素,形成一个单链表。
错题修改
具体解题步骤如图:
感悟
上课听得不仔细,没有分清楚这几种方法,但现在对错误的认识很明晰,补博客也是非常有用的!
以上是关于20172314 三种查找算法练习的主要内容,如果未能解决你的问题,请参考以下文章