Skip to content

Lecture 1. Foundations 基础知识 ​

几个基本概念 ​

数据结构 ​

A data structure is a way to store and organise data in order to facilitate access and modifications.

算法 ​

Informally, an algorithm is any well-defined computational procedure that takes some values, or set of values, as input and produces some values, or set of values, as output.

Algorithm: A tool for solving a well-specified computational problem.

算法的正确性 Correctness ​

正确的算法就是,无论对于什么输入,都会以正确的输出停止。那么,不正确的算法就是,对于一些输入,永不停止,或者以错误的输出停止。

然而,不正确的算法,也是有用处的。比如,Pollard Rho 验证大素数的算法,是不能保证 100% 正确的,但正确率足够在一些场景使用。

算法分析 Algorithm Analysis ​

大概就是,算算这个算法需要占用多少资源,比如耗时啦,内存啦,通信带宽啦。

通常不用时间来表示,而是说要运行多少步(steps)。毕竟跑的快的电脑和跑的慢的电脑可能差很多时间,然而运行多少步,对于所有电脑都一样的。

问:为啥不管常数?答:Constant numbers does not change the pattern of the rate of growth.

插入排序 Insertion Sort ​

Insertion Sort 1

插入排序就像是摸牌和理牌。

起初,手里没有牌,从牌堆摸牌,直接捏在手里。

之后从牌堆摸出来的牌,跟手里的牌从外往里依次比较大小。当遇到第一个小于等于摸到的牌,就插进去。

在示意图当中,橙色表示手里的牌,蓝色表示摸到的牌,白色表示牌堆剩下的牌。

Insertion Sort 2

伪代码如下:

Insertion Sort Pseudocode

循环不变式 Loop invariants ​

在上述伪代码当中, 表示的是当前摸到的牌的下标。在 while 循环开始之前, 表示手里的牌, 表示的是牌堆。

通过观察可以发现不管 取值如何, 都是排序过程开始之前的前 个元素,它们的值的集合一直没变,只是被排的有序了。于是, 的这个性质被称为 循环不变式 loop invariant。

循环不变式分为三个阶段:

  1. 初始化阶段:第一次循环开始之前,该性质成立。易证。
  2. 保持阶段:如果某次循环开始之前性质成立,那么下次循环开始之前性质依然成立。感性理解,每次插入新牌,原来的牌都要右移,对应着循环体迭代变量的自增。
  3. 终止阶段:循环终止后仍然成立。易证。

循环不变式有助于证明算法的正确性,尤其体现在终止阶段。

分析插入排序 ​

Insertion Sort Analysis

注:图中的 表示那个 while 循环对于 取到特定值的时候的执行次数。

分析每一条语句的执行时间和执行次数。注意,普通的(不含 break 和 continue)for 和 while 循环的循环头的执行次数应该比循环体多一次,因为最后退出循环的时候还是要执行一次判断的。

那么算法的运行时间就是所有语句的运行时间乘以执行次数的和。根据上图,得到:

\begin{aligned} T(n) &= c_1n + c_2(n-1) + c_4(n-1) + c_5(n-1) + c_8(n-1) \ &= (c_1+c_2+c_4+c_5+c_8)n - (c_2+c_4+c_5+c_8) \ &= An + B \end

\begin{aligned} T(n) &= c_1 n+c_2(n-1)+c_4(n-1)+c_5\left(\frac{n(n+1)}{2}-1\right) \ & \space\space\space\space +c_6\left(\frac{n(n-1)}{2}\right)+c_7\left(\frac{n(n-1)}{2}\right)+c_8(n-1) \ &= \left(\frac{c_5}{2}+\frac{c_6}{2}+\frac{c_7}{2}\right)n^2+\left(c_1+c_2+c_4+\frac{c_5}{2}-\frac{c_6}{2}-\frac{c_7}{2}+c_8\right) n \ & \space\space\space\space-\left(c_2+c_4+c_5+c_8\right) \ &= An^2 + Bn + C \end

\text{若 }f(n) = o(g(n))\text{,则 }\lim_{n \rightarrow \infty}\frac{f(n)}{g(n)} = 0

\text{若 }f(n) = o(g(n))\text{,则 }\lim_{n \rightarrow \infty}\frac{f(n)}{g(n)} = \infty

\begin{aligned} & f(n)=\Theta(g(n)) \text { 且 } g(n)=\Theta(h(n)) \Rightarrow f(n)=\Theta(h(n)) \ & f(n)=O(g(n)) \text { 且 } g(n)=O(h(n)) \Rightarrow f(n)=O(h(n)) \ & f(n)=\Omega(g(n)) \text { 且 } g(n)=\Omega(h(n)) \Rightarrow f(n)=\Omega(h(n)) \ & f(n)=o(g(n)) \text { 且 } g(n)=o(h(n)) \Rightarrow f(n)=o(h(n)) \ & f(n)=\omega(g(n)) \text { 且 } g(n)=\omega(h(n)) \Rightarrow f(n)=\omega(h(n)) \end

转置对称性 Transpose Symmetry ​

对于大 与大 之间、小 与小 之间,满足:

代数关系形式 ​

可以把这些记号之间的关系想象成代数中的数值关系,如:

  • 类似
  • 类似
  • 类似
  • 类似
  • 类似