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

时间:2023-02-02 15:08:24

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)