查找算法攻略


第一类——比较式查找算法

(1)基于线性表的查找:顺序查找、折半查找即二分查找、索引查找即分块查找

(2)基于树的查找:二叉排序树、B树、AVL树等

第二类——散列法(不需要比较)

一、顺序查找

1.算法原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位。

2.核心代码

public static int search(int[] a, int num) {        
    for(int i = 0; i < a.length; i++) {
        if(a[i] == num){//如果数据存在
            return i;//返回数据所在的下标,也就是位置
        }
    } 
    return -1;//不存在的话返回-1
}

3.平均查找长度:ASL = (n+....+2+1)/n= (n+1)/2。

二、二分查找

1.算法原理:

a) 前提条件:已排序的数组中查找

b) 二分查找的基本思想是:首先确定该查找区间的中间点位置: int mid = (low+upper) / 2;然后将待查找的值与中间点位置的值比较:若相等,则查找成功并返回此位置。若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域。若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域。下一次查找是针对新的查找区间进行的。

c) 图例说明:

原始数据: int[] a={5,3,6,1,9,8,2,4,7}; 查找是否存在数字8

第一步,先用之前学过的排序方法将数组按升序排序:int[] a={1,2,3,4,5,6,7,8,9};

第二步,取中间数:58比较,8大于,取中间数右侧的数组进行比较,即{6,7,8,9}

第三步:重复第一步和第二步,直到找到数据或者比较完所有数据。

2.核心代码

    //首先对数组进行排序,这里用冒泡排序
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    //二分查找算法
    public static int binarySearch(int[] arr,int num){
    
        int low=0;
        int upper=arr.length-1;
        while(low<=upper){
            int mid=(upper+low)/2;
            if(arr[mid]<num){
                low=mid+1;
            }
            else if(arr[mid]>num){
                upper=mid-1;
            }
            else
                return mid;
        }
        return -1;
    }

3.平均查找长度:ASL =(1/n)* ( j * 2^(j-1) )(j是从1到h),ASL = log2(n+1)-1。

三.索引查找

1.算法原理

(1).先取各块中的最大关键字构成一个索引表。

(2).查找分为两部分,先对索引表进行二分查找或是顺序查找,以确定待查记录在哪一块中。

(3).然后,在已经确定的块中用顺序法进行查找。

2.平均查找长度:把r【1....n】分为 b 块

如果以二分查找来确定块,则 ASL = log2(b+1)-1 + (s+1)/2。

如果以顺序查找来确定块,则 ASL = (b+1)/2 + (s+1)/2。

如果以哈希查找来确定块,则ASL=1 + (s+1)/2。

3分块查找的优点:

(1).在表中插入或删除一个记录时,只要找到该记录所属的块,就在该块内进行插入和删除运算。

(2).因为块内记录的存放是任意的,所以插入或删除比较容易,无须移动大量记录。

 缺点:分块查找算法的主要代价是增加一个辅助数组的存储空间。 


三种线性查找比较



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值