- JavaScript Algorithms and Data Structures
- 十大经典排序算法
- https://algorithm-visualizer.org/
- https://leetcode.com/
数据结构是在计算机中组织和存储数据的一种特殊方式,使得数据可以高效地被访问和修改。更确切地说,数据结构是数据值的集合,表示数据之间的关系,也包括了作用在数据上的函数或操作。
算法是如何解决一类问题的明确规范。算法是一组精确定义操作序列的规则。
算法范式是一种通用方法,基于一类算法的设计。这是比算法更高的抽象,就像算法是比计算机程序更高的抽象。
先从简单直观的 O(1) 和 O(n) 复杂度说起。O(1) 表示一次操作即可直接取得目标元素(比如字典或哈希表),O(n) 意味着先要检查 n 个元素来搜索目标,但是 O(log n) 是什么意思呢?
第一次听说可能是在学二分法的时候,比如猜数字游戏,选手猜一个数,主持人会说大了或者小了,于是选手再说一个小一半或者大一半的数这样能最快的猜中想要的数字。
比如猜 16 以内的数,目标数字是 1 最坏的情况
16 * (1/2) = 16 * (1/2)^1 = 8
8 * (1/2) = 16 * (1/2)^2 = 4
4 * (1/2) = 16 * (1/2)^3 = 2
2 * (1/2) = 16 * (1/2)^4 = 1
=>
n * (1/2)^k = 1
=>
n = 2^k
k = log n
查找次数 k 就是以 2 为底 n 的对数,就是 O(log n) 的时间复杂度
所以后面看到 归并快排 的时间复杂度 O(nlogn) 有 logn 的影子也是因为用了二分的思想