查找算法

静态查找:

数据集合稳定,不需要添加,删除元素的查找操作。

动态查找:

数据集合在查找的过程中需要同时添加或删除元素的查找操作。

对于静态查找来说,我们不妨可以用线性表结构组织数据,这样可以使用顺序查找算法,如果我们再对关键字进行排序,则可以使用折半查找算法或斐波那契查找算法等来提高查找的效率。

对于动态查找来说,我们则可以考虑使用二叉排序树的查找技术,另外我们还可以使用散列表结构来解决一些查找问题,这些技术我们都将在这部分教程里边介绍给大家。

有序的情况下以下四种方法:

顺序查找

顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功。如果查找了所有的记录仍然找不到与给定值相等的关键字,则查找不成功。

代码如下;

使用一个for判断i,内部又用if判断i,时间复杂度是O(2n),优化一下,使用哨兵a[0]优化;

这样算法复杂度为O(n),效率提高一倍

插值算法(按比例查询)

插值算法与二分(折半)查找算法唯一的不同就是计算mid

mid = low + ((key - a[low])/a[high]-a[low]))*(high 0-low);这是和插值朝赵唯一的不同点,

二分查找中是一直寻找整个数据大小的中间的那个数据,但是在插值中,是寻找查找关键点的所在位置,比如在下面图示的a数组中关键key是66,a[low]元素的值是1,a[high]的值是100,我们让key60减去a[low]1,然后再去除以a[high]-a[low],这样可以得出来一个比例值60%,这样按照比例来算,最终取出来的值是最接近要查找的值。插值算法和二分查找和插值查找的时间复杂度都是log2n,不果他们两个在不同的场景还是有很大区别的,插值查找是适合线性增长的数据组合比如刚才这个数组长度100从1

到100存放数组,这样使用比例查找事效率很高的,远高于二分查找每次都从中间取值。如果一组数组是存放的非常不均匀,a[low]是1.,a[high]是10000,最中间的值是9000,这样如果按照插值比例来找无疑是不明智的。



二分查找


斐波那契查找



非有序情况查找算法:【有时间深究下】

以上都是针对已经排好序的情况, 那么如果是没有排好序的话怎么办呢?我们还是有办法滴,那就是使用索引啦~

一共分为三种索引:稠密索引,分块索引,倒排索引

稠密索引:


分块索引:


倒排索引



接下里我们要说一下对于动态查找的方法:

大致有利用二叉树的概念来查找,哈希表,散列表,回头抽时间好好研究下 并写代码联系!切记。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值