《算法概论》-伪代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)