查找

顺序查找与折半查找

顺序查找的特点是,用所给的关键字与线性表中各元素的关键字逐个进行比较,直到成功或失败。
算法的基本思想是:在查找表的一端设置一个称为“监视哨”的附加单元,存放要查找的数据元素关键字。然后从表的另一端开始查找,如果在“监视哨”位置找到给定关键字,则失败,否则成功返回相应元素的位置。

折半查找又称为二分查找,这种查找方法需要待查的查找表满足两个条件:

首先,查找表必须使用顺序的存储结构;

其次,查找表必须按关键字大小有序排列。

算法的基本思想是:首先,将查找表中间位置数据元素的关键字与给定关键字比较,如果相等则查找成功;

否则利用中间元素将表一分为二,如果中间元素关键字大于给定关键字,则在前一子表中进行折半查找,否则在后一子表中进行折半查找。

重复以上过程,直到找到满足条件的元素,则查找成功;或直到子表为空为止,此时查找不成功。

对于查找表的查找,一般有两种情况:一种是 静态查找,指在查找过程中只是对数据元素进行查找;

另一种是 动态查找,指在实施查找过程中,插入查找失败的元素,或从查找表中删除已查到的某个元素,即允许表中元素发生变化。

 

查找树

基于树的查找方法是将待查表组织成特定的树结构,并在树结构的基础上实现查找的方法。

下面我们主要介绍二叉查找树、平衡二叉树和 B-树

具有以下性质的二叉树:

⑴ 若它的左子树不空,则其左子树中所有结点的值不大于根结点的值;
⑵ 若它的右子树不空,则其右子树中所有结点的值不小于根结点的值;
⑶ 它的左、右子树都是二叉查找树。

并不要求所有结点元素的关键字必须互异。

查找算法的基本思想是:若查找树不为空,将待查关键字与根结点元素关键字比较,若相等则返回根结点;

否则判断待查关键字与根结点关键字的大小,如果待查关键字小,则递归的在查找树的左子树中查找,否则递归的在查找树的右子树中查找。

 

在现代计算机中通常采用分级存储系统,以最简单的二级分级存储策略为例,就是由内存储器与外存储器(磁盘)组成二级存储系统。

这一策略的思想是:将最常用的数据副本存放于内存中,而大量的数据存放于外存中,借助有效的算法可以将外存的大存储量与内存高
速度的优点结合起来。

 

哈希表

直接寻址的基本思想是:

            如果存储空间的允许,我们可以为每个关键字分配一个位置,每个元素存储地址就是关键字对应的数组下标。

哈希函数

    除留余数法

    通过取 k 除以 m 的余数来将关键字 k 映射到哈希表的 m 个不同地址的某一个中去。即,哈希函数为:h(k) = k mod m

    我们通常把一个不太靠近 2 的整数次幂的素数作为m的值。

    乘法散列

    第一,我们将关键字 k 乘以一个常量 A,它的取值范围为 0<A<1,并且提出 kA 的小数部分;

    接下来,我们将这个值乘以 m,并且取结果的底。简言之,哈希函数是:h(k) = m * ( kA - ⎣kA⎦ )
    乘法散列法的一个优势是对 m 的值没有什么特别的要求。对某个 m,一般指定它的值是 2 的幂(m=2p,其中 p 是整数), 

    因为这样我们很容易就能在电脑中实现哈希函数的计算。

冲突解决

    链地址法

    我们把哈希到同一位置的所有元素都放在一个链接表中

    开放地址法

    所有的元素都存储在哈希表中,即哈希表中的每一个位置要么存储了某个元素,要么是Null。

    (1)采用开放地址法解决冲突的最简单的一种形式是线性探测。

    假设h (k)是一个哈希函数,那么线性探测法使用的哈希函数为:h(k, i) = (h  (k)+i) mod m i=0, 1, 2, … m-1

    线性探测处理冲突容易产生元素“聚集”的现象,即在处理同义词的冲突时又导致了非同义词的冲突。

    线性探测的优点是只要哈希表不满,就一定能找到一个不冲突的哈希地址,

    然而,其缺点是当装填因子α较大时,元素聚集现象非常严重,这对执行元素查找操作极为不利。

    二次探测和双散列是克服这一缺点的有效方法。

     ( 2 )二次探测使用的哈希函数如下:h(k, i) = (h (k)+i^2 ) mod m     i=0, 1, 2, … m-1

    尽管这一方法可以有效回避元素聚集的现象,但是还是会出现二次聚集的情况——元素虽然不会连续的聚集成片,

    但是会在多个间断的位置多次反弹。其次,如果 m 选择不当,可能会造成出现虽然哈希表不满,

    但是由于循环反弹以至于无法插入的情况。

    (3)双散列也是一种有效解决元素聚集问题的方法。双哈希使用如下形式的哈希函数:h(k, i) = (h1(k)+ih2(k)) mod m i=0, 1, 2, … m-1

    其中h 1 (k)和h 2 (k)均是辅助哈希函数。在这里需要注意的是,对于任何k,h 2 (k)都不能为 0,

    否则h(k, 0)= h(k, 1)= h(k, 2)=...,无法起到解决冲突的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值