《算法概论》-伪代码

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

目录

算法概论 (1)

序言 (1)

第一章 (2)

乘法 (2)

除法 (2)

两数的最大公因数 (2)

扩展 (2)

RSA (3)

第二章:分治算法 (3)

整数相乘的分治算法 (3)

递推式 (3)

2.3合并排序 (3)

第三章图的分解 (4)

3.2.1寻找从给定顶点出发的所有可达顶点 (4)

3.2.2 深度优先搜索 (4)

第四章 (4)

4.2、广度优先搜索 (4)

4.4.1、dijkstra最短路径算法 (5)

4.6.1、含有负边 (5)

Bellman-Ford算法 (6)

4.7、有向无环图的最短路径 (6)

第五章贪心算法 (6)

5.1 最小生成树 (6)

算法概论

序言

Fibonacci数列:

死板的算法:

function Fib1(n)

If n=0:return 0

If n=1:return 1

Return fib1(n-1)+fib1(n-2)

(递归,很多计算是重复的,不必要)

合理的算法:

functionFib2(n)

If n=0:return 0

Create an array f[0…n]

f[0]=0,f[1]=1

fori=2…n:

f[i]=f[i-1] + f[i-2]

return f[n]

(随时存储中间计算结果,之后直接调用)

大O符号:若存在常数c>0,使得f(n)<=c*g(n)成立,则f=O(g)。f增长的速度慢于g。第一章

乘法:

functionMultiply(x,y)

If y=0:return 0

z=multiply(x,y/2)//向下取整

If y is even: //even---偶数

return 2z

else:

return x+2z

除法:

functionDivide(x,y)

If x=0: return (q,r)=(0,0)

(q,r)=divide( x/2 ,y) //向下取整

q=2*q,r=2*r

if x is odd:r=r+1

if r>=y :r=r-y,q=q+1

return (q,r)

p22

两数的最大公因数:

function Euclid(a,b)

if b=0: return a

return Euclid(b,a mod b)

扩展:

function extended-Euclide(a,b)

if b=0: return (1,0,a)

(x1,y1,d)=extended-Euclide(b,a mod b)

retrun (y1,x1-a/b*y1,d)

RSA:

(X^e)^d ==X mod N

d=e^-1 mod(p-1)(q-1)

N=pq

第二章:分治算法

整数相乘的分治算法:

function multiply(x,y)

input:n-bit positive integers x and y

output:their product

if n=1:return xy

xl,xr=leftmost n/2_^ ,rightmost n/2_v bits of x // _^表示向上取整,_v表示向下取整yl,yr=leftmost n/2_^ ,rightmost n/2_v bits of y

p1=multiply(xl,yl)

p2=multiply(xr,yr)

p3=multiply(xl+xr,yl+yr)

return p1*p2+(p3-p1-p2)*2^(n/2)+p2

2.2

递推式:

T(n)={ O(nd):d>logba

|| O(n d *log n) :d=log b a

|| O(n^(log b a)): d

2.3合并排序

function mergersort(a[1…n])

if n>1:

return merge(mergesort( a[1…n/2]), a[n/2+1…n]))

else:return a

function merge(x[1…k], y[1…L] )

if k=0: return y[1…L]

if L=0: return x[1…k]

if x[1]<=y[1]:

return x[1]&merge(x[2…k],y[1…L])

else:

return y[1]&merge( x[1…k], y[2…L] )

第三章图的分解

3.2.1寻找从给定顶点出发的所有可达顶点:

procedure explore(G,v)

input:G=(V,E) is a graph; v ∈V

output:visited(u) is set to true for all nodes u reachable from v

visited(v)=true

previsit(v)

for each edge(v,u)∈E:

if not visited(u):explore(u)

postvisit(v)

3.2.2 深度优先搜索:

proceduredfs(G)

for all v ∈V:

visited(v)=false

for all v∈V:

if not visited(v):explore(v)

线性化序列:对图深度优先搜索,取post的降序序列。

求强连通部件:1、在反转图上运行深度优先搜索,得到post值大的点v,运行explore(G,v)。

第四章:

4.2、广度优先搜索

bfs(G,s)

相关文档
最新文档