首页 > 程序员必知8大排序3大查找(三)

程序员必知8大排序3大查找(三)

前两篇

《程序员必知8大排序3大查找(一)》

《程序员必知8大排序3大查找(二)》



三种查找算法:顺序查找,二分法查找(折半查找),分块查找,散列表(以后谈)







一、顺序查找的基本思想:

从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。

 

说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。

 

适用于线性表的顺序存储结构和链式存储结构。







计算平均查找长度。

例如上表,查找1,需要1次,查找2需要2次,依次往下推,可知查找16需要16次,

可以看出,我们只要将这些查找次数求和(我们初中学的,上底加下底乘以高除以2),然后除以结点数,即为平均查找长度。

n=节点数

平均查找长度=n+1/2

 

二、二分法查找(折半查找)的基本思想:



前提:

1)确定该区间的中点位置:mid=low+high/2    

min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置

2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:

如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中。这时high=mid-1

如果R[mid].key则等于a的关键字如果存在,必然在R[mid].key右边的表中。这时low=mid

如果R[mid].key=a,则查找成功。

3)下一次查找针对新的查找区间,重复步骤(1)和(2

4)在查找过程中,low逐步增加,high逐步减少,如果high,则查找失败。





平均查找长度=Log2(n+1)-1

 

注:虽然二分法查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算,所以二分法比较适用于顺序存储结构。为保持表的有序性,在顺序结构中插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动而又经常需要查找的线性表。

 

三、分块查找的基本思想:



二分查找表使分块有序的线性表和索引表(抽取各块中的最大关键字及其起始位置构成索引表

)组成,由于表是分块有序的,所以索引表是一个递增有序表,因此采用顺序或二分查找索引表,以确定待查结点在哪一块,由于块内无序,只能用顺序查找。







设表共n个结点,分b块,s=n/b

(分块查找索引表)平均查找长度=Log2n/s+1+s/2

(顺序查找索引表)平均查找长度=(S2+2S+n)/(2S)

 

 

注:分块查找的优点是在表中插入或删除一个记录时,只要找到该记录所属块,就在该块中进行插入或删除运算(因块内无序,所以不需要大量移动记录)。它主要代价是增加一个辅助数组的存储控件和将初始表分块排序的运算。

 

它的性能介于顺序查找和二分查找之间。



四、最近比较忙,后续找个时间还会谈谈散列表(哈希表)技术,希望大家关注!

散列表查找技术不同于顺序查找、二分查找、分块查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。

前两篇

《程序员必知8大排序3大查找(一)》

《程序员必知8大排序3大查找(二)》

 



感谢大家的支持,无论是顶的,还是踩的,都谢谢你们,希望大家互相关注,共同进步。





转载于:https://www.cnblogs.com/springside-example/archive/2012/05/11/2530098.html

更多相关:

  • 顺序查找基本思想属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。这是最基本的查找方法,也是时间复杂度最高的查找算法。在数据过多时,这种方法并不适用。代码实现分块查找基本思想属于顺序查找的改进方法,又叫索引顺序查找。将n个元素分成m块(m<=n),每个块中元素可以没有顺序,但是m个块之间是有序排列,所以...

  • 注:本文内容参考《35 Practical Examples of Linux Find Command》 网址:http://www.tecmint.com/35-practical-examples-of-linux-find-command/ Linux 查找命令是Linux系统中最重要和最常用的命令之一。查找用于根据与参数...

  • find 按时间查找 转载▼  分类: linuxShell日记 -mtime 修改时间-ctime 改变时间-atime 访问时间-mtime +5 至少5天之前修改过的文件,至少5天没修改过-mtime -5 5天之内修改过的文件-mtime 5  刚好5天前修改的文件  -perm 按权限查找 -perm  001 精确...

  •         Find从英语字面上的意思译过来是发现,找到的意思,它在linux中作为文件查找命令也十分形象,Find虽说只是个命令,但其功能非常强大。        好,下面来说说Find,先来说说它的基本语法格式:find [查找路径]  [查找标准]  [处理动作]查找标准:        -name 文件名称查找 ...

  • web.xml 的加载顺序是:context-param -> listener -> filter -> servlet 。 过滤器执行顺序是根据filter-mapping ,不是根据filter顺序。 转载于:https://www.cnblogs.com/xiongjinpeng/p/web-xml%e9%85%8d%e7...

  • 问题描述: 给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端点],如果target在nums里未出现,则返回[-1, -1]。 例如: arr = [2,3,4,4,4],target = 4,最终结果为[2,4] a...

  • 问题描述: 给定一个排序数组nums(无重复元素)与目标值target,如果target在nums里 出现,则返回target所在下标,如果target在nums里未出现,则返回target应该 插入位置的数组下标,使得将target插入数组nums后,数组仍有序。 例如: 数组 arr = [2,3,4,6] target = 1...

  • 75. Find Peak Element 【medium】 There is an integer array which has the following features: The numbers in adjacent positions are different.A[0] < A[1] && A[A.length...

  • 题目: Given a positive integer num, write a function which returns True if num is a perfect square else False. Note: Do not use any built-in library function such as sqrt...

  •  有序表查找 /* 主函数 */public class OrderTableSearch {public static void main(String[] args) {int [] a= {0,1,16,24,35,47,59,62,73,88,99}; System.out.println(FibonacciSearc...