(1)线性查找和二分搜索

线性查找算法遍历数组,直到找到查询内容,其时间复杂度为O(n)。

public static int lineatSearch(int[] list,int key)
    {
        for(int i=0;i<list.length;i++)
        {
            if(key==list[i])
               return i; 
        }
        return -1;
    }

二分搜索算法的时间复杂度为O(logn).

public static int binarySearch(int[] list,int key)
    {
        int low=0;
        int high=list.length-1;
        while(high>=low){
            int mid=(low+high)/2;
            if(key<list[mid])
                high=mid-1;
            else if(key==list[mid])
                return mid;
            else low=mid+1;
        }
        return -low-1;
    }
/** Use binary search to find the key in the list */
  public static<E extends Comparable<E>> int binarySearch(E[] list, E key) {
    int low = 0;
    int high = list.length - 1;

    while (high >= low) {
      int mid = (low + high) / 2;
      if (key.compareTo(list[mid]) < 0) {
        high = mid - 1;
      }
      else if (key.equals(list[mid])) {
        return mid;
      }
      else {
        low = mid + 1;
      }
    }

    return -low - 1; // Now high < low
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找,也称折半查找,相较于线性查找具有显著的优势。二分查找的优势主要体现在**时间复杂度、前提条件和查找过程**等方面。具体分析如下: 1. **时间复杂度** - **二分查找**:时间复杂度为O(log2n),随着数据量的增加,所需查找的时间增长较慢。 - **线性查找**:时间复杂度为O(n),在最坏的情况下需要遍历整个数组来找到目标元素或确定元素不存在。 2. **前提条件** - **二分查找**:必须作用于一个已排序的数组或集合,因为算法依赖于元素的有序性来分割搜索区间。 - **线性查找**:不需要元素预先排序,适用于无序或有序的数据结构。 3. **查找过程** - **二分查找**:查找过程中不断将数组分成两半,比较中间值与待查找值的大小,从而决定是查找左半部分还是右半部分。 - **线性查找**:逐个检查元素直至找到目标值或遍历完全部元素。 4. **效率对比** - **二分查找**:在大量数据中查找时效率远高于线性查找,尤其是在数据量巨大时,二分查找的效率优势更为明显。 - **线性查找**:在小型数据集或无序数据集中可能更简便,但在大型数据集上效率较低。 5. **实现复杂度** - **二分查找**:实现较为复杂,涉及到计算中点、比较和递归或循环逻辑。 - **线性查找**:实现简单,通常只需要一层循环即可完成查找。 6. **适用场景** - **二分查找**:最适合处理静态有序的数据集。 - **线性查找**:适用于数据量不大或者实时更新较多的场合。 7. **空间复杂度** - **二分查找**:由于是递归,空间复杂度在最坏情况下可达到O(n),若用循环则可以降低到O(1)。 - **线性查找**:空间复杂度为O(1),不需要额外的存储空间。 8. **数据依赖性** - **二分查找**:对数据的有序性有严格要求。 - **线性查找**:不受数据是否有序的影响。 总的来说,二分查找在效率上通常优于线性查找,特别是在处理大数据集时。然而,它的前提是数据必须是有序的,而线性查找对数据顺序没有要求。在选择查找算法时,应考虑数据集的大小和有序性,以及实际的应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值