引论
- 算法与数据结构与程序的区别
- 算法是求解问题的过程描述:从蛮力到策略
- 数据结构是数据的组织与存储:从杂乱无章到井然有序
- 程序 = 算法 + 数据结构
- 算法描述
- 自然语言
- 伪代码
- 流程图
- 三种不同的计算机问题
- 判断问题(yes,no) 例如输入的数是否大于60
- 优化问题(求最优解) 例如从A到B的最短路径是什么
- 数值计算
- 常见的计算机问题
- 排序
- 查找
- 串处理
- 图问题
- 组合问题
- 几何问题
- 数值问题
- 概念
- 什么是算法:算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
- 算法特征
- 输入:算法有零个或多个输入量
- 输出:算法至少产生一个输入量
- 确定性:没有二义性
- 有穷性:有限步后结束
- 要点:
- 算法的每一个步骤必须清晰、明确
- 算法所处理的输入的值域必须仔细定义。
- 同样的一个算法可以用几种不同的形式来描述
- 可能存在几种解决相同问题的算法
- 针对同一个问题的算法可能会基于完全不同的解题思路
算法复杂性分析
算法的时间效率和空间效率度量都用输入规模的函数来度量
-
时间复杂度:
T(n) ≈ copC(n)
n是该算法的输入规模
cop是特定计算机上一个算法基本操作的执行时间(基本操作:最内层循环操作)
C(n)是该算法需要执行的基本操作的次数
最优效率,最差效率,平均效率
-
指数级复杂度与多项式级复杂度
- 指数级复杂度:很多穷举搜索,但要尽量避免,只能用于规模很小的问题
- 多项式算法
-
渐进表达式:忽略常数
O(读"O"):上界
Ω(读"omiga"):下界
Θ(读"theta"):近似
若f(n)=32n^2+17n+32,和O(n),Ω (n), Θ(n), O(n^2), Ω(n^2), Θ(n2),O(n3), Ω(n^3), Θ(n^3).相匹配
则f(n)属于O(n2)、O(n3)、Ω(n^2)、Ω (n)、Θ(n^2)
理解:以O(n2)为例,O(n2)表示一个集合,表示所有比kn2小的函数(k为任意正常数),或者函数图像在kn2下方的函数,所以f(n)∈O(n2)表示32n2+17n+32也是属于此集合。
-
注意
- O(n^2)表示一个集合
- 所以用等号时等价于属于符号:f(n)=O(n2)等价于f(n)∈O(n2)
- 更加方便理解的式子
f(n)= O(g(n)) 理解为 f(n) ≤ kg(n);
f(n)= Ω(g(n)) 理解为 f(n) ≥ kg(n);
f(n)= Θ(g(n)) 理解为 f(n) = kg(n);
f(n)= o(g(n)) 理解为 f(n) < kg(n);
f(n)= ω(g(n)) 理解为 f(n) > kg(n).
基本的效率类型
c < logn < (logn)^2 < n < nlogn < n^2 < n^3 < 2^n < n!
-
n:找n个数最大值
nlogn多出现在分治算法中:如合并排序和堆排序
n^2:平面上多点求最近两点之间距离时每对点尝试
n^k:多项式时间:如独立集问题
指数时间:最大独立集问题
-
渐进增长率比较的方法
-
极限法
相除取极限,=0,=c,=∞
取对数再比较
-
贪心算法
思想:每步最优
-
硬币零钱问题 (coin changing)
对于某些指定硬币面值类型,使用贪心策略(优先最大面值)可以求得最小硬币数来组成某数。例如我国的货币面值类型(1元,5元,十元,50元,100元),或(1,5,10,25,100)
证明:此时贪心算法是求得的解最优解:
以(1,5,10,25,100)为例
思路: 首先明显有性质:
N1(1元的数量)≤4 //大于4可用一个5来代替,结果更优
N5≤2
N10+N25≤2
N25≤3
对于求总额x的零钱策略:有ck ≤ x ≤ ck+1。则依照贪心策略,必须取ck。若存在非贪心最优解,则不取ck,此时就必须在c1,...ck-1中选择硬币来代替ck,则会与上述性质矛盾
贪心算法不是对所有的硬币问题都适用
-
任务安排问题 (interval scheduling )
寻找不重叠的最多任务数。
策略:以结束时间排序,后贪心选择不重叠最早的结束的一个任务。
证明:此时贪心算法是求得的解最优解:
假设俩个解,
一个是最优解(任务i1...ir,x,j1...jm)
一个是贪心解 (任务i1...ir,y,q1...qn)
即
- 前r个任务选择相同
- x任务比y任务结束时间晚,但是m>n(最优解数量大于贪心解数量)
则x一定可以换为y,(上一个任务相同,x任务比y任务结束时间晚,可画图来解释),所以最优解一定可以转换为贪心解,即贪心解是最优解。
-
课程分配教室问题(interval partitioning)
给有不同开始结束时间的课程分教室,使得教室数最少
策略,每次贪心给一个教室最早开始时间的课程
-
多任务最早结束问题
每个任务有开始结束时间,问所有任务最晚结束的时间
策略:最早结束时间排序
分治
思想:分而治之
-
步骤
- 将问题划分为若干个子问题(同样规模)
- 递归求解每个子问题,注意写好递归边界
- 将若干子问题的解合并成问题的解
时间复杂度nlogn
-
逆序对
问题:给定一个序列,例如a[5]={5,4,8,10,2},找出这样的数对,i
a[j]例如这个例子包含(5,4),(5,2),(4,2),(8,2),(10,2) 5个逆序对。 策略:
分两段A,B,分别求A,B中逆序数,N1,N2。T(n)+T(n)
-
求a∈A,b∈B的逆序数,N3
N3=0;
比较ai,bj,(ai∈A,bj∈B)
若ai小,ai入数组C,i+1
若bj小,bj入数组C,j+1。N3+=A中剩余的数的个数。Θ(n)
在归并排序的同时记录一个数据。
加起来,N1+N2+N3。
有递推式:
T(n)={
Θ(1) if n=1
2T(n/2)+Θ(n) if n>1
}
主定理(master theorem )
根据递推式来确定时间复杂度
整数乘法( integer multiplication )
问题描述:
x=10001101,y=11100001,计算x*y
以x和y的位数做输入规模n,常规计算方法并不是最优Θ(n^2)
策略:
分治思想,x=10001101,y=11100001
将x和y分成前4位和后四位。
m= ⎡n/2⎤ (x,y有n位)
a = ⎣x/2^m⎦ , b = x mod 2^m
c = ⎣y/2^m⎦ ,d = y mod 2m
即a=1000,b=1101,c=1110,d=0001
利用交换律:有以下公式
xy=(2m*a+b)(2m*c+d)=2/2mac+2m(bc+ad)+bd
所以将x*y转换成了四次规模为原来一半的乘法
有
T(n)={
Θ(1) if n=1
4T(n/2)+Θ(n) if n>1
}
根据主定理
T(n) = Θ(n^2)所以并没有提升效率
所以但是可以观察出若求得小规模的乘法数量小于4,就会提升效率,所以将公式变形
xy=(2^m*a+b)(2^m*c+d)=2/^2mac+2^m(bc+ad)+bd
= 2^2m*ac+2^m(ac+bd–(a–b)(c–d))+bd
此时只有个规模更小的运算
所以
T(n)={
Θ(1) if n=1
3T(n/2)+Θ(n) if n>1
}
则T(n) = Θ(n^log3)=O(n1.585)
-
矩阵乘法(matrix multiplication)
常用计算时间复杂度为Θ(n^3)
分治,经过一系列公式推导有
T(n) = 7T(n/2)+Θ(n^2) = =Θ(nlog7)=O(n2.81)
-
最近点对(closest pair of points )
问题描述:
给定平面上n个点,求这n个点中距离最近的两个点的距离是多少。
策略:我们将平面上的点划分为两部分,每部分n/2个点,递归求解两部分的最近点距离。难点在于子问题的合并:求出两小部分中的最近点d1,d2后,将两小部分合成一个大部分时,大部分的最近点问题(两个点来自不同的部分d3),则此时大部分最进点对距离min{d1,d2,d3}。
-
如何寻找d3:
记min{d1,d2}=δ
找到距离两小部分边界小于δ的点(在横坐标区域[-δ,δ]内)
计算区域内的最小距离即为d3
-
动态规划
重叠子问题,最优子结构
-
带权任务安排问题:weighted interval scheduling
此时贪心算法并不能得到最优解
策略:
以结束时间排序 f1
p(j)上一个与任务j相容的任务
OPT(j)表示j前任务(1-j)相容子集最大权重,所以目标是OPT(n)
所以对于求OPT(j),根据是否选择j有公式
OPT(j)={
0 if j=0
max{OPT(j-1),wj+OPT(p(j))} if j>0
}
矩阵连乘问题
最长公共子序列
OPT(i,j)={
o if i=0||j=0
OPT(i,j)=1 if i,j>0,xi=yj
max{OPT(i,j-1),c(i-1,j)} if i,j>0,xi!=yj
}
-
01背包问题
对于i号物体有重量wi和价值vi,求总量W最多能装多少价值的东西
策略:
OPT(i,w)表示放前i个物体后,剩下的空间
- 根据是否选择i号物体有公式
OPT(i,w)={
0 if i=0
OPT(i-1,w) if wi>w
max{OPT(i-1,w),vi+OPT(i-1,w-wi)} otherwise
}
P,NP,NPC,NPhard
https://blog.csdn.net/sinat_21591675/article/details/86521190 一个很好的讲解博客
-
规约
X规约到Y——X可由 标准多项式次数 加 多项式次数的调用Y 组成
规约是将一个特殊问题一般化的过程。
X ≤ p Y.
If X ≤ P Y and Y can be solved in polynomial time, then X can be solved in polynomial time.
If X ≤ P Y and Y can be solved in polynomial time, then X can be solved in polynomial time.
y 比 x 难
-
P
多项式时间里解决的判定问题
-
NP
多项式的时间里验证一个解,不确定是否能在多项式时间求解
P ⊆ NP ⊆ EXP
P=NP? 即是否多项式验证就可多项式求解
-
NPC
NP完全问题,最难的NP问题:所有的NP问题都可以归约到的一个NP问题。
NPC的证明:If X ∈ NP-complete, Y ∈ NP, and X ≤ p Y, then Y ∈ NP-complete.
Basic genres of NP-complete problems and paradigmatic examples.
Packing/covering problems: SET-COVER, VERTEX-COVER,INDEPENDENT-SET.
Constraint satisfaction problems: CIRCUIT-SAT, SAT, 3-SAT.
Sequencing problems: HAMILTON-CYCLE, TSP.
Partitioning problems: 3D-MATCHING, 3-COLOR.
Numerical problems: SUBSET-SUM, KNAPSACK.
- 如果p!=np 则难度
P
- 如果p=np 则难度
P=NP=NPC 属于NP hard的一个子集
-
一线
-
点独立集和点覆盖集
点覆盖集:一个点集合:图中所有边与此集合中某点邻接
电独立集:一个点集合:此集合中任意两点之间没有边相连
INDEPENDENT-SET ≡ p VERTEX-COVER.
此两个问题可以相互规约,点覆盖集加点独立集可以合成这张图(互补)
-
点覆盖集规约到集合覆盖
集合覆盖:一个大的集合和若干子集合,求用k个子集合并集可以组成原集合。
-
点覆盖集:一个点集合:图中所有边与此集合中某点邻接
图中的点---子集合
图中的边---子集合中的元素
VERTEX-COVER ≤ p SET-COVER.
可满足性问题-satisfiability (SAT)
- 例如公式
Φ = (x1(反) ∨ x2 ∨ x3 )∧ (x1 ∨ x2(反) ∨ x3 ) ∧(x1(反) ∨ x2 ∨ x4 )
是否存在布尔值的xi使公式的结果为ture
x1 = true, x2 = true, x3 = false, x4 = false
3-SAT意为每个括号有三个元素
- SAT可以规约到独立集问题
每个括号是一个三角形的图,元素做点,每个三角形之间互反的元素链接
- 有3-SAT ≤ P INDEPENDENT-SET ≤ P VERTEX-COVER ≤ P SET-COVER.
-
2线
-
规约和转化
转化:如果给定X的任何一个实例,我们可以构造Y的一个实例y,使得x是X的yes实例,如果Y是Y的yes实例。
转化相当于规约中X只用了一次Y而不是多项式次数的Y。
-
哈密顿环问题(遍历图中所有点的环)
有向图哈密顿环问题归约到哈密顿环问题,将一个点分成三个点来模拟有向性
3-SAT归约到有向图哈密顿环,问题,先根据CETIFEIR构造有向环,左到右为xi=1.后在某两点之间额外构造新连线。来验证是否符合。CETIFEIR
3SAT归约到最远路径问题
哈密顿环归约到旅行商问题
-
3线
3-SAT归约到3着色问题
-
平面图和地图着色问题相互规约
图中没有两条边相交即称这个图是平面的
平面的图在处理很多问题(最短路径最大流最小割MST等等)上会变容易
平面三着色问题是NPC
-
平面图三着色与普通图三着色
普通三着色归约到平面三着色,普通NPC -推出->平面NPC
K-着色问题,任何图都是4可着色图
-
4线
-
3可满足问题归约到子集合和问题
Ex. { 215, 215, 275, 275, 355, 355, 420, 420, 580, 580, 655, 655 },
W = 1505.
Yes. 215 + 355 + 355 + 580 = 1505.
转换到二进制
子集合和归约到01背包问题
-
树的独立集问题
不带权:贪心。事实:一定有独立集包含叶子
带权:动态规划
-
最小覆盖集
- 二倍近似,贪心
3-SAT,求法
TSP 动态规划O(n^2 *2^n)
相似算法
-
负载均衡
贪心每个任务分给当前任务最小的机器,是二倍近似的。证明:考虑一次分配的过程
优化,先将任务降序排列之后用上述贪心1.33倍近似。证明:考虑一次分配的过程
-
中心选择
将第一个中心放在单个中心的最佳位置,然后继续添加中心,以便每次都尽可能减小覆盖半径。反复选择下一个中心距任何现有中心最远的站点。此算法是二倍近似的
-
最小带权点覆盖集
出价方式。是二倍近似的
ILP(整数规划) min∑wi*xi nph
LP 可解决 2近似
-
广义负载均衡
ILP
LP
01背包问题
分界线
图的算法
prim,kruskal求最小代价树
floyd O(N^3),dijkstra O(N^2)求最短路径