• 顺序查找&二分查找&索引查找


    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)

  • 相关阅读:
    PHP chgrp() 函数
    PHP basename() 函数
    PHP user_error() 函数
    PHP trigger_error() 函数
    my.cnf需要改的参数
    WPF 使用 Direct2D1 画图入门
    win10 uwp 如何开始写 uwp 程序
    win10 uwp 如何开始写 uwp 程序
    C# 快速释放内存的大数组
    C# 快速释放内存的大数组
  • 原文地址:https://www.cnblogs.com/GumpYan/p/5754661.html
Copyright © 2020-2023  润新知