数据结构(九)—— 查找

一、顺序查找

        顺序表或线性链表表示的静态查找表,表内元素之间无序。通过查找的对比的平均比较次数(ASL)来决定算法的查找速度;

 直接查找:此算法的思维比较简单,只要一个循环比对,就可以了。实现如

for(i = Arr.length;i<=1;--i)
    if(Arr[i] == key) return i;

此算法的平均查找速度,就是1/n*(n*(n-1))/2 = (n-1)/2;即1到n的累加再乘以1/n。

折半查找算法:此算法适合顺序表元素之间具有相对顺序,即从大到小排序或者从小到大排序。

算法思维:将比对的数先跟数组位置为中间的数比对,如果比中间的数大,则往右边的数再进行二分,通过不断缩小比对的范围来查找到最终的值。如下图所示:

 算法实现:

设置一个low表示低位置的指针,如初始,low指在数组0的位置;

设置一个high表示高位置的指针,如初始,high指在数组Max的位置,即最后一个元素;

再设置一个mid表示中间元素位置的指针,如初始,mid = (low + high) /2;

通过比对key跟mid指向的值,来查找。

int Search_Bin(SSTable ST,KeyType key){ //SSTable表示顺序表的结构体
    low = 0;
    high = ST.length;
    while(low <= high){
        mid = (low + high) /2;
        if(ST.R[mid] == key) return mid;
        else if(key <ST.R[mid])
            high = mid - 1;
            else low = mid + 1;
    }
    return 0;
}

其查找的算法计算可以如下图所示:

分块查找:将表分成几块,然后每块里头数据无序,块间有序。结合下图理解;

算法思维:建立一个索引表,将一个区间的数放到同一块中,进而可以减少查找时比对的次数。 

其查找效率入下图所示:

 三种算法的比对可如下图所示:

 二、散列查找(Hash(哈希)查找)

        散列查找,就是选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放,查找时,由同一个函数对给定值k计算地址,将k与地址单元元素关键码进行比对,确定查找是否成功。

构建函数的要求:选择函数尽可能简单,以便提高转换速度;所选函数对关键字计算的地址,应该散列地址集中均匀分布,以减少空间浪费。

查找出现冲突时,应该有对应的冲突解决的规则,又归序地查询其他相关单元。

1. 选择函数的方法有多种,这里介绍的是除留余数法。设置的函数格式如下图所示:

根据顺序表的元素的个数设置足够的内存m,然后将关键字对p进行取模从而放到对应的位置。索取的p<=m且为质数。

2.选取解决冲突的方法,解决冲突的方法同样有多种,如下图所示,这里主要是介绍线性探索法.

线性探索法,主要对取余有冲突的元素对往后空格进行移动 ;结合如下例子进行理解

 则其算法的查询平均长度如下:

 其中a为填装因子,表示表中的元素量跟表长的比,进而表示表的利用率,如果a越大,表示表中元素填装越满,则发生冲突的可能性就更大。

 散列查找的过程如下:

其中二叉排序树的查找跟平衡二叉树可以看以下链接:

二叉排序树和平衡二叉树 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值