算法笔记

1

Algorithm(算法)和Program(程序)的区别

Algorithm Programe
Design(设计过程) Implementation(执行过程)
Domain knowledge(对应领域知识) programmer(程序员)
All language(所有语言皆可) programe language(仅程序语言:C、C++、Java、Python)
No Hardware/software and OS H/W and OS
Analyse(分析) Testing(调试)

1.2

Characteristics of Algoithm (算法特性)

  1. Input 0个或更多
  2. output 至少一个
  3. Definiteness (确定性) 明确
  4. Finiteness (有限性)不能是无限的,要有结束
  5. effectiveness(效力)

1.3

How to Analyse an Algorithm

criteria(准则):

time :一个操作占用一个单元时间似乎太过于细节,所以选择一个语句作为一个单元时间,用O(1)表示,代表常数1

space:用S(n)表示,有几个变量,写S(n)=几word,为啥用word,因为我们不知道变量的类型,或者说变量的类型不唯一

data transferred(已传输的数据) network consumption

power consuming

CPU Registers (CPU寄存器)

1.4

Frequency Count Method

f(n)=2n+3 ==> O(n)

for语句是n+1,i<n需要判断n+1次

fn应是整个流程要进行的最小单元语句的次数

S(n)=n+3 ==> O(n)

1.5

Time Complexity

下面是一些例子

时间复杂度用一条执行语句算

这个比较难算,我觉得我是算不出的

这段语句不是嵌套的,所以复杂度不是n方是n

注意这个是O(loglogn)

第一句可以写n也可以写n+1,这没有什么区别,记一些常用的对于计算有帮助

一个算法有最好情况和最坏情况,比如上面这个,最好情况就是m和n相同O(1),最坏的情况是两者不同,并且需要很多次O(n)。

同样,这个也是分情况的

将上算法做部分修改删掉了n<5的情况,算法就没有最好和最坏情况了,这里想说的应该是复杂度和判断语句有关

1.7

时间复杂度快慢比较

大O ——上界

欧米噶Ω ——下界

西塔θ —— 平均界

大O的定义解释

f(n)<=__ 横线填一个带n的式子,要比左侧大,图中写的是10n,根据这个式子可以得出对n的一个条件n>1

以n为界限,包括n和他之后的都是upper bound,包括他之前的都是lower bound ,n是average bound

fn=On,fn=On方,fn=O2的n次方都对,但是我们总是写最小的那个,那是useful的

fn=Ologn不对

Ω的定义,和大O定义相反

θ的定义类似是两者的定义的结合,这时fn=希尔他n不能写其他

这些都可以用来表示算法的复杂度,这和算法的最好情况和最坏情况无关,不要混淆

下面是一些例子

介于n方和n三次方

n的阶乘写不出希尔他的形式,只能写出Ω(1)和O(n的n次方)

1.9

扩大常数倍大O不变

Ω和θ也一样

大O有传递性

θ具有对称性

f(n)=O(g(n))andf(n)=Ω(g(n))==》f(n)=θ(g(n))

两个function相乘,O也是相乘

比较两个function的O时,可以同时加log

最后loglogn特别小,所以比较logn的数量即可

第四条我没推出来,查是两次换底公式,没搞明白

可以多次log约

这两个function是同级的

这两个不是同级的

不是分段的,g2>g1

1.11

可以用任何符号(O、Ω、θ)表示function,这和最好最坏情况没有关系

二分查找树的高度是logn,n是树上的元素个数,最坏的情况是查找位于叶子的元素,也就是需要查找树的高度次,也就是logn,所以最坏的情况下查找效率是logn

但是,也有树是倾斜的情况,也是二叉查找树,但是此时的最坏情况的查找效率就是n了

所以最坏的情况的效率取决于树的高度

1.12

两个不相连的set,通过查找和联合,使其成为一个圆,知道在图中有一个圆。

借助这个用于图转生成树,确保树中没有循环

选择图中合适的边用于生成树

当发现一个节点的最终父节点时,可以在数组中将其父节点改为最终父节点,方便下次查找,我们叫这种查找叫折叠查找,不太懂。

2

Divide and Conquer(分治法)