对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
顺序查找
基本思想
属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。
这是最基本的查找方法,也是时间复杂度最高的查找算法。
在数据过多时,这种方法并不适用。
代码实现
分块查找
基本思想
属于顺序查找的改进方法,又叫索引顺序查找。
将n个元素分成m块(m<=n),每个块中元素可以没有顺序,但是m个块之间是有序排列,所以特别适合于节点动态变化的情况。
分块查找的速度虽然不如二分查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。
那么索引表的构成就是每个块中的最大元素。
查找方式是先对索引表进行二分或顺序查找,选出目标值应该所在的块,然后在块内进行顺序查找。
二分查找
基本思想
属于有序查找算法,也叫折半查找,就是将数组每次选取一半进行查找,怎么选取一半就需要让中间值与目标值value进行比较,因为有序,所以中间值小于目标值则选取后半部分,大于目标值则选取前半部分,依此类推,直到找出与目标值相等的元素,否则返回-1或null。
这种方法有效的缩减查找次数和查找范围,适用于数据量比较大的有序表。
因为前提是有序表,所以对于插入删除等操作过多的数据集并不适用,因为在排序算法上浪费的时间会比较多。
一般的时间复杂度是O(log2n)
代码实现
插值查找
基本思想
属于二分查找的改进版,二分查找一直重复一半一半的操作,这种操作比较固定,并不会根据目标值的大小进行自适应分段和选择,而插值查找可以根据目标值value进行自适应。
下面是百度词条对插值的解释:插值类似于平常查英文字典的方法,在查一个以字母C开头的英文单词时,决不会用二分查找,从字典的中间一页开始,因为知道它的大概位置是在字典的较前面的部分,因此可以从前面的某处查起。
既然是二分查找的改进版,那么就要找关键点进行改进,二分是取1/2的有序表进行查找,那么mid就是关键点,二分中mid=(low+high)/2,可以转化成mid=low+(high-low)/2,所以相当于(high-low)/2中的1/2就是所分的比例,那么可以对mid进行改进,mid=low+low+(value-list[low])/(list[high]-list[low])*(high-low),(value-list[low])/(list[high]-list[low])就是所分的比例。
根据目标值在整个有序表中所处的位置,让mid的变化更靠近目标值value,这样也就间接地减少了比较次数。
这种方法适用于关键字分布均匀的有序表。
复杂度为O(log2(log2n))
代码实现
斐波那契查找
基本思想
斐波那契数列与0.618有着奇妙的关联,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,所以可以将黄金比例运用到查找中。
百度词条:斐波那契搜索,斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F(n),将原查找表扩展为长度为F(n)(如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。
这个方法比较重要,所以百度词条上讲的很清楚!
代码实现
总结
- 还剩下两种非常重要的查找算法,就是树表和哈希,这两种我就单独写,ball ball大佬们不要嫌弃!
对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...相关推荐
- leetcode算法题--最长的斐波那契子序列的长度
原题链接:https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence/ 1.set暴力法 对于任一个斐波那契序列来 ...
- 实验一 线性表的顺序存储与实现_程序员:数据结构与算法,线性表介绍
线性表 线性表(list):零个或多个数据元素的有限序列. 举个例子:一个班的小朋友,一个跟着一个排队,当中的每个小朋友都知道他前面的是谁,后面的是谁,如同一根线把他们串联起来.就可以称之为线性表. ...
- node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树
1.中序线索化二叉树 创建如上的二叉树,线索化二叉树时,根据指定的遍历方式得到的节点的访问顺序,一个节点前面的节点,叫做前驱节点,一个节点后面的节点,叫做后继节点. 线索化二叉树的规则: ...
- JSK-4 简单斐波那契【基础+打表+记忆化递归】
简单斐波那契 斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加.用数学公式定义斐波那契数列则可以看成如下形式: F0=0 F1=1 Fn=Fn−1+Fn ...
- Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...
- 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)
假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...
- leetcode - 873. 最长的斐波那契子序列的长度(使用到哈希表)
873. 最长的斐波那契子序列的长度 -------------------------------------------- 如果序列 X_1, X_2, -, X_n 满足下列条件,就说它是斐波那 ...
- 算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)
转载 BinarySearch.java /*** @ClassName BinarySearch* @Description 折半查找** 可以使用插值公式将折半查找性能优化** 只需将其中的 mi ...
- LeetCode 873. 最长的斐波那契子序列的长度(动态规划)
文章目录 1. 题目 2. 解题 2.1 暴力解 2.2 动态规划 1. 题目 如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的: n>=3n >= ...
最新文章
- AI领域五年引用量最高的10大论文:Adam登顶,AlphaGo、Transfromer上榜
- 零基础自学python的app-编程零基础应当如何开始学习 Python?
- java idea 模块_使用IntelliJ IDEA搭建多maven模块JAVA项目
- C语言6F多少,求助!!请人帮忙画C语言程序流程图.紧急!!!
- Educational Codeforces Round 47
- Project Euler 97 :Large non-Mersenne prime 非梅森大素数
- Helm 3 完整教程(十六):Helm 函数讲解(10)版本语义化函数、URL函数、UUID函数
- 只用两行代码,我让Transformer推理加速了10倍
- android API Guides学习--Introduction(1)
- Windows系统下使用WCP搭建自己的本地知识库管理平台
- 华为od业务主管面试问题-我的回答
- 贫富分化是生产力发展的必然趋势 zz
- 网页设计 尺寸 html5,网页设计一般至少设置多少高度?制作网站时网页的尺寸是多少?网页的屏幕尺寸是多少?...
- 日常学习记录——pycharm+tensorflow简单图像识别
- 移动端图片变模糊问题
- 机器人巨头争霸,谁主沉浮?
- 实验八 一阶常微分方程初值问题Matlab实现
- VS2017中英文切换设置
- 将必应输入法设置成纯英文的输入法,再也不必为切换中英文而烦恼了
- 计算机专业十六字口号,潮流十六字班级口号