算法分析知识整理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Chapter 0

1. Big O

O() 即<=

洛必达法则

一边有分母,一边无分母的,可以两边都先乘分母再比较,或再用洛必达法则

例:log n! =Θ(logn n)

因为(n/2)log(n/2)=log(n/2)n/2<=logn!<=logn n=nlogn

任何指数形式> 任何多项式形式

任何多项式形式> 任何对数形式

Chapter1

1.复杂度计算

Mod运算等于一个除法运算的复杂度

一般,计算复杂度,先看循环次数(注意以比特位n计算时,logN=n),再看循环内复杂度最高的那个运算

n位长数作加减运算,为O(n),作乘除法运算为O(n2)

乘2,除2,相当于移位,是常数时间运算

2.计算mod

mod和加减乘除运算规则相同,也有交换律、结合律、分配率、替换率

例如,21390 mod 31 = (25)x mod 31 = (32)x mod 31 = (1)x mod 31 = 1

若ax=1 mod N,则a和x互为mod N下的模倒数,有模倒数的充要条件是a和N互质例:求20 mod 79的模倒数

用辗转相除法,每个式子标记3个数(除系数外都标记)

gcd(20,79)79=3*20+19

gcd(19,20)20=1*19+1

gcd(1,19)19=1*19+0

gcd(0,1)1=1-0

再逆代回去(逆代的每一步都找对应gcd时作标记的数,用余数代换,用被除数合并)

1=1-(19-1*19)代换0然后合并1

=20*1-19

=20*(20-1*19)-19 代换1然后合并19

=20*20-21*19

=20*20-21*(79-3*20)代换19然后合并20

=83*20-21*79

故模倒数为83,又因模倒数必须在1至N之间,则为83-79=4

Chapter2

1.分而治之Divide and conquer: T(n)=aT(n/b)+O(n d)

在递归中的每一层,将处理问题分为a个子问题(即子问题个数是上一级的a倍),而每个子问题处理时的对象(函数的输入)被分为b份(即对象大小为上一级的1/b),而每一步的复杂度为O(n d)

2.Master theorem: T(n)= O(n d) d>log b a

T(n)= O(n d logn) d= log b a

T(n)= O(n log b a) d

Merge算法处理n个元素merge的复杂度为O(n)

T(n/2)是执行了logn层递归,T(n/b)是执行了log b n层递归

Chapter3

1.DFS(有向图无向图都适用)

Explore算法只对起始点可达的点visit,包括previsit和postvisit标记

Explore(v)会生成以v为根的子搜索树

DFS算法是对G中所有的点用explore

for all v in V: if not visited(v) then explore(G ,v)

DFS算法复杂度为O(|E|+|V|)

因为DFS中,previsit(v)时,对v为根的子搜索树为陌生的,而postvisit(v)时则对子树已完全熟悉,所以若u和v是祖先--孩子关系,则必有[pre(u),post(u)]包含[pre(v),post(v)],否则u,v完全不相交,不可能出现部分相交的关系,如pre(u)< pre(v)

2.DAG有向无环图

对有向图用DFS算法,若其生成的搜索树中有回边<=>该图存在环

DAG必有至少一个源(入度为0),和至少一个汇(出度为0),必可以线性化

凡DAG图问题,必先线性化

DAG图线性化方法一:用DFS算法后,对post number降序排序,post number越小越靠后DAG图线性化方法二:从图中找一个源,删除它,不断重复该过程直至图为空

3.SCC强连通子图

u和v连通指从u->v有路径,同时从v->u也有路径可达

对无向图,连通子图个数就是其DFS算法中的搜索树的棵树

无向图作出连通子图的方法:在DFS算法中加个数组ccnum[v]赋初值为cc(cc=0),DFS 过程中每调用一次explore则cc++,最后cc值为连通子图个数,有相同ccnum值的v即为一个连通子图

对有向图中所有互相连通的节点归为一个个强连通子图后(一个子图视为一个节点),有向图成为一个DAG图,该DAG图中的源称为源强连通子图,其汇称为汇强连通子图Lemma1:对一个汇SCC内任意一节点用explore算法,可以刚好visit该子图内所有点(因为互相连通,且因为是汇,故不会visit该SCC以外的点)

Lemma2:有向图的post number最大值必存在于其源强连通子图中

Lemma3:若有一条边是从强连通子图C通向另一个强连通子图C’,则C中Max post number >C’中Max post number,所以有向图可以通过对其每个强连通子图的Max post number降序排序来线性化

有向图作出其强连通子图的方法(线性时间):

(1)在其反向图G’上用DFS算法(G’上的源SCC就是G上的汇SCC,为了应用Lemma1,因为只有汇SCC才能一次explore找出该SCC所有点)

(2)用无向图作连通子图的算法处理G,且DFS过程中对每个节点以其在(1)中的post number降序顺序来处理(应用Lemma2和Lemma3)

Chapter4

相关文档
最新文档