zoukankan      html  css  js  c++  java
  • 顺序查找&二分查找&索引查找

    1.查找技术的分类。如下图:

      

    2.什么是顺序查找呢?(无序表)

      顺序查找的原理很简单,就是遍历整个列表逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。如果直到最后一个记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。

      时间复杂度是O(n)

    3.二分查找(前提就是有序表)

      二分查找的基本思想是:

         在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。

      从二分查找的定义我们可以看出,使用二分查找有两个前提条件

        (1)待查找的列表必须有序通常是从小到大的顺序)。

        (2)必须使用线性表的顺序存储结构来存储数据底层用数组实现的)。

      时间复杂度是O(logn),可以看到远远好于顺序查找的O(n)

    public class BinSearch{
    	int min,max,mid;
    	public static int halfSearch(int[] arr,int key){
    		 int min=0;
    		 int max=arr.length-1;
    		 int mid=(max+min)/2;
    		 while(arr[mid]!=key){
    			 if(key>arr[mid]){
    				 min=mid+1;
    			 }else{
    				 max=mid-1;
    			 }
    			 if(min>max)
    				 return -1;
    			  mid=(max+min)/2;
    		 }
    		 return mid;
    	}
    	public static void main(String[] args){
    		int[] arr={3,5,7,9,10,14};//有序的,从小到大排的
    		int index=halfSearch(arr,7);//要查找7,返回的是索引值
    		System.out.println(halfSearch(arr,7));
    	}
    }
    

    4.索引查找  

      关于索引,我们很容易地联想到数据库中的索引,建立了索引,可以大大提高数据库的查询速度。

      索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法。

      分块查找的基本思想是

      首先查找索引表,可用二分查找或顺序查找(因为块间是有序的,可以用二分查找),

      然后根据块首指针找到相应的块,并在确定的块中进行顺序查找。

      满足两个条件:

      (1)块内无序,每一块内的记录不要求有序。

      (2)块间有序,如第二块记录的所有关键字要大于第一块,第三块的要大于第二块

      分块查找的时间复杂度为O(√n)。

      在实现索引查找算法前需要弄清楚以下三个术语。

      (1)主表。即要查找的对象。

      (2)索引项。一般我们会将主表分成几个子表,每个子表建立一个索引,这个索引就叫索引项。

      (3)索引表。即索引项的集合。

      同时,索引项包括以下三点

      (1)最大关键码,就是存储的每一块中的最大关键字(那一块中数字最大的那个)

      (2)块长,就是每一块的元素个数

      (3)块首指针,就是每一块第一个元素的指针

      

    栗子1:

    有个长度为12的无重复有序表,按折半查找法进行查找,在表内各元素等概率情况下,查找成功所需的平均比较(三元比较)的次数为(37/12

     解释:

      此题按照一颗完全二叉树来考虑,12个结点是4层,所以为(1*1+2*2+4*3+5*4)/12

    栗子2:

    有如下一个类似跳表的数据结构:每层都是已经排好序的链表,level1层的链表有所有元素,levelN层的链表只有levelN-1的1半的元素,levelN层的结点指向levelN-1层中相同的结点。请问查找一个元素的时间复杂度是:

    解释:

    这是一个类似二分查找的算法:时间复杂度O(logn)

    二分查找时间复杂度计算:

    总共有n个元素,

    渐渐跟下去就是n,n/2,n/4,....n/2^k,其中k就是循环的次数

    由于你n/2^k取整后>=1

    即令n/2^k=1

    可得k=log2n,(是以2为底,n的对数)

    所以时间复杂度可以表示O()=O(logn)

  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/GumpYan/p/5754661.html
Copyright © 2011-2022 走看看