入门😀
牢记:世界上并没有哪种适用于所有场景的数据结构或者算法。
你不能因为有序数组能使用二分查找就永远只用有序数组。在经常插入而很少查找的情况下,显然插入迅速的常规数组会是更好的选择。
数组
连续内存空间分配。
- 长度n
- 读取: O(1)
- 查询: O(n),常规数组的查找方式:线性查找
- 插入: n+1 n挪动元素,1插入; 末尾:O(1)
- 删除: n=1+(n-1) 1删除, n-1挪动元素; 末尾:O(1)
集合
不重复。
- 插入:先确定要插入的值不存在于其中,即每次插入都要先来一次查找。
- 最好情况N+1,N判断
最坏的情况则是在集合的开头插入,这时计算机得检查 N 个格子以保证集合不包含那个值,
然后用 N 步来把所有值右移,最后再用 1 步来插入新值。总共 2N + 1 步
- 最好情况N+1,N判断
算法
解决某个问题的一套流程,例如把大象放入冰箱需要几步?
有序数组
有序数组中插入新值,需要先做一次查找以确定插入的位置。这是它跟常规数组的关键区别(在性能方面)之一。
但在查找方面,有序数组却有着特殊优势。有序数组的线性查找大多数情况下都会快于常规数组。除非要找的值是最后那个,或
者比最后的值还大,那就只能一直查到最后了。
查找算法
线性查找
从左至右,逐个格子检查,直至找到。这种方式称为线性查找。
线性查找的最好情况是 O(1),最坏情况是 O(N)
二分查找 🌓
有序数组相比常规数组的一大优势就是它除了可以用线性查找,还可以用二分查找。常规数
组因为无序,所以不可能运用二分查找。
对于长度太小的有序数组,二分查找并不比线性查找好多少。但我们来看看更大的数组。
对于拥有 100 个值的数组来说,两种查找需要的最多步数如下所示。
- 线性查找:100 步
- 二分查找:7 步
规律就是,每次有序数组长度乘以 2,二分查找所需的最多步数只会加 1
大O表示法
时间复杂度。
大 O 记法一般都是指最坏情况总。体上来说,O(N)比 O(1)低效。
知道各种算法会差到什么程度,能使我们做好最坏打算,以选出最适合的算法。
- 二分查找O(log N) ,读作“O log N”,叫作对数时间
该算法当数据量翻倍时,步数加 1
以上介绍的3中算法,照效率由高到低来排序的话,会是这样:
- O(1)
- O(log N)
- O(N)
为什么会是O(log N)😵
源自数学中的对数log,它是指数的反函数。
log2 8 可以表达为:将 8 不断地除以 2 直到 1,需要多少个 2?
答案是:3
当我们说 O(log N)时,其实指的是 O(log2 N),不过为了方便就省略了 2而已。
O(log N)则代表算法处理 N 个元素需要 log2 N 步,如果有 8 个元素,那么这种算法需要 3 步,
因为 log2 8 = 3
O(log N)算法的步数等于二分数据直至元素剩余 1 个的次数