数据结构与算法 | 青训营笔记

52 阅读1分钟

高性能的程序其中的数据结构和算法都是根据具体情况,选择适用的算法实现的。合理的算法选择更利于我们高效的利用资源。下面我为大家简绍一种数组中常用的算法:

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表顺序存储结构,而且表中元素按关键字有序排列。同时还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

二分查找涉及的很多的边界条件,逻辑比较简单。一般出错的主要原因是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在循环寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

go语言代码示例:

func search(nums []int, target int) int {
    left:=0
    right:=len(nums)-1
    for left<=right{
        var middle int = left+(right-left)/2   // 防止溢出 等同于(left + right)/2
        if target==nums[middle]{
            return middle
        }else if target>nums[middle]{
            left=middle+1
        }else{
            right=middle-1
        }
    }
    return -1
}

此外,数组中很多算法都使用了双指针,使用双指针的方法减少了时间复杂度。