本课程主要介绍算法设计与分析的基本方法以及算法复杂性理论基础。通过本课程的学习,要求学生理解并熟练掌握递归与分治法、贪心法、动态规划方法、回溯法、分支定界法,以及高级图论算法、线性规划算法等,理解并掌握算法复杂性的分析方法、NP完全性理论基础等计算复杂性的基本知识及完备性证明概要。
目录
第一周作业–算法概述及复杂性理论
- 给定一个算法,其输入是一个整数集S和一个整数m,输出是和为m的所有S的子集,算法步骤如下:(1)列出S的全部子集,求他们的和。(2)逐个查看步骤(1)列出的子集,把每个和等于m的子集输出。
上述算法是否满足算法特点?说明理由。
满足有穷性、确切性、输入项、输出项和可行性。
因为S的子集个数是有限个,所以该算法总会在有限个步骤之后终止,所以满足有穷性;
该算法的步骤定义清楚,是计算机可以实现的步骤,所以满足确切性;
该算法的输入项为0,满足输入项;
该算法的输出为和等于m的子集,满足输出项;
该算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,满足为有效性。
- . 利用循环不变量证明下述计算a^n算法的正确性:
Exp(a,n)
i<-1
pow<-1
while i<=n do
pow<-pow*a
i<-i+1
return pow
循环不变量:pow=a^(i-1)
初始步:循环开始之前,i=1,pow=1,a^0=1=pow,如果n=0,则不循环,返回1。若n=1,则循环一次,pow=a,满足要求
迭代:假设第k次迭代后,循环不变量满足要求,此时 p o w = a k , i = k + 1 pow=a^k , i=k+1 pow=ak,i=k+1
第k+1次迭代时, p o w = p o w ∗ a = a k + 1 , i = i + 1 = k + 2 pow=pow*a=a^{k+1}, i=i+1=k+2 pow=pow∗a=ak+1,i=i+1=k+2,此时 a i − 1 = a k + 1 = p o w a^{i-1}=a^{k+1}=pow ai−1=ak+1=pow,满足要求
终止: p o w = a n , i = n + 1 , 所 以 a i − 1 = a n = p o w pow=a^n,i=n+1,所以a^{i-1}=a^n=pow pow=an,i=n+1,所以ai−1=an=pow,满足要求
- 设有两个在同一机器上实现的算法,运行时间分别为 100 n 2 和 2 n 100n^2和2^n 100n2和2n。当n取何值时,前者比后者快?
由计算得:当n等于15时,100n2等于22500,2n=32768,前者比后者快
第二周作业–算法分析方法
1.对某个数据结构执行一个具有n个运算的序列。如果i为2的整数幂,则第i个运算的费用为i否则为1.使用合计方法确定每次运算的分摊费用。
设 C i C_i Ci为第i步实际的代价,则
∑ i = 1 n C i ≤ n + ∑ j = 0 l o g n 2 j = n + ( 2 n − 1 ) < 3 n \sum_{i=1}^nC_i \leq n+ \sum_{j=0}^{log \ n}2^j = n+(2n-1) <3n i=1∑nCi≤n+j=0∑log n2j=n+(2n−1)<3n
所以每次分摊费用为 O ( 1 ) O(1) O(1)
- 用势能方法分析上题。
定义 C i C_i Ci为分摊代价, c i c_i ci为实际代价。设 i = 2 j + k i=2^j+k i=2j+k,定义第i个操作Di的势函数 Φ ( D i ) = 2 ∗ k 。 Φ(D_i)=2*k。 Φ(Di)=2∗k。
当k=0时,实际代价 c i = i c_i=i ci=i, 这 时 i − 1 对 应 的 k 为 : 2 j − 2 j − 1 − 1 这时 i-1对应的k为: 2^j-2^{j-1}-1 这时i−1对应的k为:2j−2j−1−1
所以
C i = c i + Φ ( D i ) − Φ ( D i − 1 ) = i + ( 0 − 2 ( 2 j − 2 j − 1 − 1 ) ) = i − ( 2 j ( 2 − 1 ) − 2 ) = i − i + 2 = 2 \begin{aligned} C_i &=c_i+Φ(D_i)-Φ(D_{i-1}) \\ &=i+(0-2(2^j-2^{j-1}-1)) \\ &=i-(2^j(2-1)-2) \\&=i-i+2 \\&=2 \end{aligned} Ci=ci+Φ(Di)−Φ(Di−1)=i+(0−2(2j−2j−1−1))=i−(2j(2−1)−2)=i−