layout: post
title: 数据结构与算法—二分查找
date: 2019-10-8
tag: 数据结构与算法
时间复杂度 - 大 O 表示法:指出了算法的速度有多快
- 普通算法的复杂度是:O(n)
- 二分查找的时间复杂度是 O(log n) :比如说要从 0-100 中找到一个值,假设查询一个值的时间是 1ms n那么二分查找最多只需要 (log 100) 即 7ms ,而普通查找最多需要 100ms
二分查找 (python 代码)
class Solution:
def search(self, nums: List[int], target: int) -> int:
if len(nums) == 0:
return -1
low = 0
high = len(nums)-1 # 注意
while low<=high:
mid = low + ((high-low) >> 1) # 取整,移位更高效,防止溢出
if nums[mid] == target:
return mid
elif nums[mid] > target:
high = mid-1 #
elif nums[mid] < target:
low = mid+1 #
return -1
二分查找的局限性:
若 nums = [1,2,2,2,3] ,target = 2 则结果有多种可能,后续解决
总结
- 二分查找的速度比简单查找快得多。
- O(log n) 比 O(n)快。需要搜索的元素越多,前者比后者就快得越多。
- 算法运行时间并不以秒为单位。
- 算法运行时间是从其增速的角度度量的。
- 算法运行时间用大 O 表示法表示。 (log 是以 2 为底)
- 大 O 表示法指出了最糟情况下的运行时间
常见的时间复杂度表示
O(log n) | 也叫对数时间,这样的算法包括二分查找。 |
---|---|
O(n) | 也叫线性时间,这样的算法包括简单查找。 |
O(n * log n) | 快速排序——一种速度较快的排序算法。 |
O(n2) | 选择排序——一种速度较慢的排序算法。 |
O(n!) | 旅行商问题的解决方案——一种非常慢的算法。 |
参考:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-xiang-jie-by-labuladong/