• 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…来查找空位,而不是查看紧随其后的下一个。
    • 链接地址法
      • 同以上的区别就是,在遇到冲突时,排在同一位置的下一个元素,形成一个单链表。

    错题修改

    具体解题步骤如图:

    感悟

    上课听得不仔细,没有分清楚这几种方法,但现在对错误的认识很明晰,补博客也是非常有用的!

  • 相关阅读:
    第七章11
    第七章10
    第七章9
    第七章8
    第七章7
    第七章6
    第七章5
    第七章例7-13
    第七章例7-12
    第七章例7-11
  • 原文地址:https://www.cnblogs.com/YiYiYi/p/9818146.html
Copyright © 2020-2023  润新知