数据结构基础24:索引查找和二分查找

一、查找技术的分类

图片转自网络

二、顺序查找(无序表)

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

时间复杂度是O(n)

三、二分查找(有序表)

前提就是有序表,二分查找的基本思想是:

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

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

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

(2)要取中间记录作为比较对象,就必须使用线性表的顺序存储结构来存储数据(底层用数组实现的)。

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

Java实现:

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));
    }
}

四、索引查找

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

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

分块查找的基本思想是:

a、先选取各块中的最大关键字构成一个索引表;

b、查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。

满足两个条件:

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

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

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

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

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

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

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

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

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

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

总结:索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找。索引查找的过程是:首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定K1对应的子表在主表中的开始位置和长度,然后再根据给定的关键字K2,在对应的子表中查找出关键字等于K2的元素(结点)。对索引表或子表进行查找时,若表是顺序存储的有序表,则既可进行顺序查找,也可进行二分查找。否则只能进行顺序查找。

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

五、数据库索引的实现

索引是用B+树实现的

由于索引是采用 B+树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片, 这和磁盘碎片、内存碎片产生原理是类似的,这些存储碎片不仅占用了存储空间,而且降低了数据库运行的速度。如果发现索引中存在过多的存储碎片的话就要进行 “碎片整理”了,最方便的“碎片整理” 手段就是重建索引, 重建索引会将先前创建的索引删除然后重新创建索引,主流数据库管理系统都提供了重建索引的功能,比如 REINDEX、REBUILD 等,如果使用的数据库管理系统没有提供重建索引的功能,可以首先用DROP INDEX语句删除索引,然后用ALTER TABLE 语句重新创建索引。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构何哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值