线性查找算法

线性查找主要分以下三种情况:
(1)线性查找
(2)二分查找(折半查找)
(3)分块查找

(1)线性查找
在待查数据中进行顺序性轮询查找,当存在待查的数据时返回当前数据索引位置,如果不存在则返回不存在表示-1

平均查找长度: 1/2(n+i)
计算方式:为当前元素查找到的概率乘上所匹配的次数

时间复杂度: O(N)

Java代码实现:

public class 线性查找 {

    public static int search(int[] number,int key){

        int[] temp = new int[number.length+1];
        //设置末尾为监视哨
        for(int i=0;i<number.length;i++){
            temp[i] = number[i];
        }
        temp[number.length] = key;
        int result = 0;
        //进行查找匹对
        for(int i=0;;i++){
            if(temp[i] == key){
                result = i;
                break;
            }
        }
        if(result < number.length){
            return result;
        }else{
            return -1;
        }
    }

    public static void main(String[] args){
        int[] number = {12,24,53241,126,52,35,5263,7};
        int key= 52;
        System.out.println(线性查找.search(number, key));
    }

}

(2)二分查找(折半查找)

特点是待查询的表为有序表,设置一个左标示为0一个右标示为当前数组长度,让当前待查元素与表中间元素进行匹配,如果一致则直接返回中间索引,如果小于中间索引则让右标示等于middle,如果大于中间索引,则让左标示等于middle。

优缺点:
优点就是因为比较的次数大大减少索引效率很高
缺点就是要待查询的表为有序表,这就大大限制的所能操作的领域,并且只对查询效率有所优化,当修改和插入数据的时候这种效率就很低了。因为还有考虑修改或插入之后元素之间顺序的问题。

平均查找长度: (n+1/n)*(log2(n+1))-1

时间复杂度: O(logN)

Java代码实现:

public class 折半查找 {

    public static int halfSort(int[] data,int key){
        int left = 0;//左标记
        int right = data.length-1;//右标记
        int result = -1;
        while(left<=right){ //进行中间判断
            int half = (left+right)/2;
            if(data[half] == key){
                result = half;
                break;
            }else if(data[half] < key){
                left = half;
            }else{
                right = half;
            }
        }
        return result;
    }

    public static void main(String[] args){
        int[] number = {1,2,3,4,5,6,7,8,9,10};
        int key = 6;
        int result = 折半查找.halfSort(number, key);
        if(result == -1){
            System.out.println("当前数据不存在");
        }else{
            System.out.println(result);
        }
    }
}

(3)分块查询
先建立一个索引表,索引表中对当前待查的元素进行了分块处理,每一块中包含了当前块中的最大元素,并且后一块中的元素全部大于之前元素,块的个数一般都是平均分割的。这样当查询某一元素的时候只需要先再确定属于哪一个块,之后再到块中进行查找定位,他的效率是基于顺序查找和折半查找中间的,并且他比折半查找要更加灵活,不在局限于有序表。

时间复杂度及平均查找长度:
当采用不同顺序查找方式进行分块查找和块内查找不同。
当采用顺序查找时:1/2(n/s + s) +1
当采用折半查找时: log2(n/s + 1) + 1

参考:http://www.cnblogs.com/hanjun/archive/2013/02/05/2892826.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 假设数组长度为n,元素x存在于数组中的概率为1/2,查找到x所需的比较次数为f(n),则查找不到x所需的比较次数为n-f(n)。 由于x不在数组中的概率为1/2,因此平均比较次数为: (1/2)f(n) + (1/2)(n-f(n)) = n/2 移项得到: f(n) = n/2 因此,该线性查找算法的平均时间复杂度为O(n)。 ### 回答2: 要计算一个确定有一半的时间下被查找元素x不在数列中的线性查找算法的平均时间复杂度,需要先了解线性查找算法的基本操作和过程。 线性查找算法是一种简单直观的查找方法,其基本操作是遍历整个数列,逐个比较元素和目标元素x,直到找到对应的元素或遍历完整个数列。 由于题目假设有一半的时间下元素x不在数列中,根据概率论的知识,可以假设元素x在数列中的概率为p,不在数列中的概率为1-p,其中p=1/2。 在线性查找算法中,无论x是否在数列中,都需要进行遍历比较操作,所以基本操作的时间复杂度为O(n),其中n为数列的长度。 如果 x 不在数列中,则需要遍历完整个数列才能确定元素不在数列中。而在有一半的时间里元素不在数列中,可以将不在数列中的情况视为遍历完整个数列的一种情况。因此,在不在数列中的情况下,平均时间复杂度为O(n)。 如果 x 在数列中,则需要遍历数列的一部分才能找到元素x。根据题目中的假设,元素x在数列中的概率为1/2,因此遍历数列的一半时间可以找到。在数列中的情况下,平均时间复杂度为O(n/2)。 根据概率的加权平均原理,将不在数列中和在数列中情况的时间复杂度按照各自的概率进行加权平均即可得到最终的平均时间复杂度: 平均时间复杂度 = (1-p) * O(n) + p * O(n/2) = (1-1/2) * O(n) + (1/2) * O(n/2) = (1/2) * O(n) + (1/4) * O(n) = (3/4) * O(n) = O(n) 因此,这个确定有一半的时间下被查找元素x不在数列中的线性查找算法的平均时间复杂度为O(n)。 ### 回答3: 要计算一个确定有一半时间下被查找元素x不在数列中的线性查找算法的平均时间复杂度,可以按照以下步骤进行计算: 1. 首先,假设元素x在数列中的概率为p,不在数列中的概率为1-p。根据题意,有一半的时间下元素x不在数列中,即p = 1/2。 2. 线性查找算法是遍历整个数列,直到找到目标元素或遍历结束。在最坏情况下,即元素x在数列的最后一个位置时,需要遍历整个数列。因此,最坏情况下的时间复杂度为O(n)。 3. 计算平均时间复杂度,需要考虑元素x在数列中和不在数列中的情况。在元素x不在数列中的情况下,需要遍历整个数列才能确定目标元素不在数列中。在元素x在数列中的情况下,需要遍历数列直到找到目标元素。因此,在每次查找中,遍历数列的次数为n/2。 4. 由于元素x在数列中的概率为p,不在数列中的概率为1-p,所以平均情况下遍历数列的次数为(n/2) * p + n * (1-p) = n(p + 1/2 - p) = n/2。 5. 根据平均情况下遍历数列的次数为n/2,再考虑到最坏情况下的时间复杂度为O(n),可以得出该线性查找算法的平均时间复杂度为O(n/2) = O(n)。 综上所述,对于一个确定有一半的时间下被查找元素x不在数列中的线性查找算法,其平均时间复杂度为O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值