算法笔记
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 (算法特性)
- Input 0个或更多
- output 至少一个
- Definiteness (确定性) 明确
- Finiteness (有限性)不能是无限的,要有结束
- 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(分治法)