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 三种查找算法练习的主要内容,如果未能解决你的问题,请参考以下文章

数据结构和算法三个“二分查找”练习

算法练习(二分查找/排序)

算法练习(二分查找/排序)

算法练习题力扣练习题——数组: 在有序数组中查找元素存在的范围

算法练习-NOJ-1001-二分查找

2017-2018-2 20172314 『Java程序设计』课程 结对编程练习_四则运算