1,陈述算法在最坏时间下的时间复杂度和平均时间复杂度;这两种评估算法复杂性的方法各自有什么意义?
答:最坏情况下的时间复杂度称之为最坏时间复杂度,一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。
这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
平均时间复杂度是指所有可能的输入实例均以同等概率出现的情况下,算法的期望运行时间。
2,阐述动态规划算法与贪心算法的区别,他们都有哪些优势和劣势?
答:动态规划算法与贪心算法都要求具有最优子结构性质,这是二者的一个共同点。
动态规划与分治法和贪心算法类似,它也是将原问题分解成为若干个更小的,相似的子问题,并通过求解子问题产生一个全局最优解,与分治法和贪心法的不足在于:
使用贪心算法时,当前的选择可能要依赖于已经作出的所有选择,但不依赖于有待于作出的选择以及子问题。因此,贪心算饭是自顶向下(即从起点到终点),一步一步的作出贪心选择。当然,如果当前的选择可能要依赖于子问题的解时,则难以通过局部的贪心策略达到全局最优解。
使用分治算法的时候,由原问题分解出的各子问题通常是相互独立的,即不包含公共的子问题,因此,一旦递归地求出各个子问题的解后,便可以自下向上的将各个子问题的解合并成问题的解。如果,各个子问题不相互独立,则分治算法要作出许多不必要的工作,重复的求解公共的子问题。
动态规划允许由原问题分解出的问题之间的相互依赖,每一个子问题只求解一次,并将结果保存起来,避免每次碰到此问题时都要重复计算。
3,阐述回溯算法与分支限界算法的共同点和不同点,提高算法效率的关键是什么?
答:分治限界法与回溯法的联系在于所求解目标,即回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分治限界的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义上的最优解。分治限界法与回溯法的本质区别在于搜索方式的不同,即回溯法以深度优先的方式搜索解空间树,而分治限界法则以宽度优先或是以最小耗费优先的方式搜索解空间树,故回溯法更适用于处理哪些寻求所有可行解的问题,而分治限界法更适用于处理求最优解的问题
分治限界法主要强调利用约束函数,限界函数和优先级函数来提高效率;而回溯法主要强调如何组织解空间的结构来提高求解效率,同时也利用约束函数和限界函数来避免无效的搜索,从而提高效率。
4,在对算法进行时间复杂性分析时,强调渐进复杂性的意义是什么?
答:简化算法复杂性的分析与步骤,即只要考察当问题的规模足够大时,算法复杂性在渐进意义下的阶。
5,Prim算法与Kruskal的基本步骤
答:
prim算法的基本步骤: n 2 n^2 n2
1,选择G的一条权值最小的边e,形成一棵两点一边的子树。
2,假设G的一棵子树T已经确定。
3,选择G的不在T中的具有最小权值的边e,使得 T U { e } T~U~\lbrace e\rbrace T U {e}仍是G的一棵子树。
Kruskal算法的基本步骤: e log e e\log e eloge
1,选择图G的一条权值最小的边e。
2,假设已经选好G的一组边 L = { e 1 , e 2 , . . . , e k } L = \lbrace e_1,e_2,...,e_k\rbrace L={e1,e2,...,ek}
3,选择G的不在L中的具有最小权值的边 e k + 1 e_{k+1} ek+1,使得 L U { e k + 1 } L~U~\lbrace e_{k+1}\rbrace L U {ek+1}诱导出的G的子图不含G的圈。
6,归并排序和快速排序算法各自强调了那几个方面?各自提高到效率的策略是什么?
答:归并排序算法属于分治算法的思想,所以归并排序算法是对原问题进行单纯的对称分解,分解期间没有任何对问题进行求解的动作,直到子问题下降到足够小,这个时候子问题能够直接求解,然后自底向上的合并子问题的解,这时,才利用原问题的特定求解动作,强调的是合并的过程。
快速排序算法的策略是将求解动作在分解子问题的过程中就开始进行,快速排序强调分解,递归的把小于基准值元素的子数列和大于基准值的元素子数列进行排序。
提高效率的策略:
归并排序:问题减小到一定规模后,直接进行直接排序
快速排序:基准值的选择
7,在对算法进行复杂性分析的时候,时间复杂度用什么来衡量?其间做了什么假定?渐进复杂性指的是什么?精确到什么程度?
答:度量:A:操作计数:找一个或者多个关键操作,确定这些关键操作所需要的执行时间。
B:确定程序总的执行步数。假定,对于四种基本操作以及比较操作,都看作是基本操作,约定所用的时间都是一个单位。
假定:所有的基本操作的所用的时间都是一个单位。
渐进复杂度:设 T ( n ) T(n) T(n)是算法A的时间敷在读,一般来说,当n单调增加趋向于正无穷时, T ( n ) T(n) T(n)也点掉增加到正无穷,如果存在 T ( n ) ^ \hat{T(n)} T(n)^使得 n − > ∞ n->\infty n−>∞时,有 T ( n ) − T ( n ) ^ T ( n ) − > 0 \frac{T(n) - \hat{T(n)}}{T(n)} -> 0 T(n)T(n)−T(n)^−>0,则称 T ( n ) ^ \hat{T(n)} T(n)^是 T ( n ) T(n) T(n)当n趋向于无穷的渐进复杂度。
精确到的程度:进一步分析比较,要比较两个算法的渐进复杂性,只要确定各自的阶数就可以知道哪一个算法的效率高。
8,在连通无向图G的宽度优先搜索树与深度优先搜索树中,那一棵树的最长路径可能会更长?是说明你的理由。
答:深度优先搜索树的最长路径可能会长一些
理由:根据连通无向图G的性质和图的深度优先搜索方法可知,在图G中由于任何两个顶点之间是可达的,那么采用深度优先搜索会沿着顶点的邻居顶点一直搜索下去,直到所有的顶点被搜索完为止,此时所有的顶点构成一条路径;而采用宽度优先搜索算法,所有的顶点形成至少一条路径,因此,深度优先搜索树额最长路径可能会长一些,这是由于两者的搜索方式决定的。
9,何为最优化原理?采用动态规划必须满足的条件是什么?动态规划是通过什么问题的什么特性来提高效率的?
答:最优化原理指出,多阶段过程的最优决策序列应当具有这样的性质:无论过程的初始状态以及初始决策是什么,其余的决策都必须相对于初始决策所产生的状态过程一个最优决策序列。
采用动态规划的算法必须满足的条件是最优子结构性质和子问题重叠性质
动态规划算法是通过子问题的重叠特性来提高效率的。
10,确定性图灵机与非确定性图灵机模型的主要区别在哪里?确定性图灵机下,算法的时间复杂度以及空间复杂度指的是什么?
答:确定性图灵机DTM与非确定性图灵机NDTM的主要区别:确定性图灵机在任一状态下只能做一种运算,而非确定性图灵机可以被看作为在同一时刻能够独立的,并行的完成(无限)多种运算。
确定性图灵机模型下的时间复杂度T(n):程序M处理长度为n的输入所需要的最大计算步数
确定性图灵机模型下的空间复杂度S(n):程序M处理长度为n的输入时,在k条读写所使用过的方格总数。
11,多项式时间确定性算法与多项式时间非确定性算法的主要区别是什么?
答:多项式时间确定算法可以在确定性图灵机DTM上用多项式时间 p 1 ( n ) p_1(n) p1(n)内计算出结果,多项式时间非确定性算法可以在一台非确定性图灵机NDTM上用多项式时间 p 2 ( n ) p_2(n) p2(n)内计算出结果,但在确定性图灵机上,需要用时间复杂度为 O ( 2 p 2 ( n ) ) O(2^{p_2(n)}) O(2p2(n))的算法来求解。
12,什么是NP问题?证明一个问题是NPC问题一般采用那几个步骤
答:存在多项式时间的算法的一类问题称之为P问题(Polynomial)
存在多项式时间内可验证的一类问题称之为NP问题(Non-deterministic Polynomial)
从非形式的意义上来说,如果一个问题属于NP,且与NP中的任何一个问题都是一样难的,这样的一类问题称之为NPC问题或者NP完全问题
证明一个问题是NPC问题的步骤:1,证明 Π ∈ N P \Pi \in NP Π∈NP,2,选取一个已知的NP完全问题 Π ‘ \Pi^{‘} Π‘,3,构造一个从 Π ‘ \Pi^{‘} Π‘到 Π \Pi Π的变换f,4,证明f是一个多项式变换
13,什么事并行算法?并行算法有哪几种主要的模型?衡量并行算法优劣主要用那几个技术指标?
答:并行算法就是在并行机上用很多个处理器联合求解问题的方法和步骤
主要模型:
(1),PRAM(Parallel Random Access Machine)随机存取并行机器模型。
(2),BSP 是一个分布存储的MIMD计算模型。
(3),MPC (Massively Parallel Computers)巨量并行机,它由成千个功能强大的处理器/存储器节点,通过具有有限带宽的和相当大的延迟的互联网络构成。
(4),LogP 是一种分布存储的,点到点通信的多处理机模型。
(5),C3 假定处理机不能同时发送和接受消息。
并行计算中两个主要的技术指标是加速比和并行效率,这两个技术指标都与程序执行时间密切相关,较高精度时间的获取对评价一个并行计算至关重要。
1,下面是归并算法排序
MergeSort(low,high):
if low < high:
mid = (low+high)/2
MergeSort(low,mid)
MergeSort(mid+1,high)
Merge(low,mid,high)
endif
end MergeSort
用 T ( n ) T(n) T(n)表示该程序所用的时间,并假定 T ( 1 ) = a T(1) = a T(1)=a,且,合并子程序所用时间与n成正比,集cn,c是正实数
(1),写出递推关系式
T ( n ) = { a n=1 2 T ( n 2 ) + c n n>1 T(n)= \begin{cases} a& \text{n=1}\\ 2T(\frac{n}{2}) + cn& \text{n>1} \end{cases} T(n)={a2T(2n)+cnn=1n>1
(2), n = 2 k n=2^k n=2k解 T ( n ) T(n) T(n)的表达式.
T ( n ) = 2 T ( n / 2 ) + c n = 2 ( 2 T ( n / 4 ) + c n 2 ) + c n = . . . = a n + c n log n T(n) =2T(n/2)+cn = 2(2T(n/4)+c\frac{n}{2})+cn = ... = an + cn\log n T(n)=2T(n/2)+cn=2(2T(n/4)+c2n)+cn=...=an+cnlogn
(3),证明:对于一般的n,有 T ( n ) = O ( n log n ) T(n) = O(n\log n) T(n)=O(nlogn)
证明:对于一般的整数,有 2 k ⩽ n < 2 k + 1 2^k\leqslant n<2^{k+1} 2k⩽n<2k+1则有 T ( n ) ⩽ T ( 2 k + 1 ) = a ∗ 2 k + 1 + c ∗ 2 k + 1 ( k + 1 ) ⩽ a ∗ 2 n + c ∗ 2 n log n = 2 a n + a c n log n + 2 c n T(n)\leqslant T(2^{k+1}) = a*2^{k+1} + c*2^{k+1}(k+1) \leqslant a*2n+c*2n\log n = 2an +acn\log n +2cn T(n)⩽T(2k+1)=a∗2k+1+c∗2k+1(k+1)⩽a∗2n+c∗2nlogn=2an+acnlogn+2cn, T ( n ) = O ( n log n ) T(n) = O(n\log n) T(n)=O(nlogn)
2,用动态规划的思想考虑0/1背包问题:
(1)证明:0/1 背包问题具有最优子结构的性质:
证明:这个问题归纳成为数学规划问题:
max ∑ 1 ⩽ i ⩽ n p i x i \max\sum_{1\leqslant i\leqslant n}p_ix_i max1⩽i⩽n∑pixi
s . t . ∑ 1 ⩽ i ⩽ n w i x i ⩽ c , x i ∈ { 0 , 1 } , i = 1 , 2 , 3 , . . . , n s.t. ~ \sum_{1\leqslant i \leqslant n}w_ix_i \leqslant c~,~ x_i\in\lbrace 0,1\rbrace ~,~ i=1,2,3,...,n s.t. 1⩽i⩽n∑wixi⩽c , xi∈{0,1} , i=1,2,3,...,n
0/1背包问题具有最优子结构的性质,事实上,若 y 1 , y 2 , . . . , y n y_1,y_2,...,y_n y1,y2,...,yn是原问题的最优解,则 y 2 , . . . , y n y_2,...,y_n y2,...,yn是以下问题的最优解:
m a x ∑ 2 ⩽ i ⩽ n p i x i max\sum_{2\leqslant i \leqslant n}p_ix_i max2⩽i⩽n∑pixi
s . t . ∑ 2 ⩽ i ⩽ n w i x i ⩽ c − y 1 w 1 , x i ∈ { 0 , 1 } , i = 1 , 2 , 3 , . . . , n s.t.~ ~ \sum_{2\leqslant i\leqslant n}w_ix_i\leqslant c-y_1w_1~,~x_i\in\lbrace 0,1\rbrace ~,~ i=1,2,3,...,n s.t. 2⩽i⩽n∑wixi⩽c−y1w1 , xi∈{0,1} , i=1,2,3,...,n
因为,若 y 2 ′ , . . . , y n ′ y_2^{'},...,y_n^{'} y2′,...,yn′是子问题的最优解,且使得
∑ 2 ⩽ i ⩽ n p i y i ′ > p i y i \sum_{2\leqslant i \leqslant n}p_iy_i^{'}>p_iy_i 2⩽i⩽n∑piyi′>piyi
则 y 1 , y 2 ′ , . . . , y n ′ y_1,y_2^{'},...,y_n^{'} y1,y2′,...,yn′将是问题的可行解,与假设悖论,故得证。
n = 4 , ( p 1 , p 2 , p 3 , p 4 ) = ( 10 , 15 , 6 , 4 ) , ( w 1 , w 2 , w 3 , w 4 ) = ( 4 , 6 , 2 , 3 ) , M = 12 n=4,(p_1,p_2,p_3,p_4) = (10,15,6,4)~,~(w_1,w_2,w_3,w_4)=(4,6,2,3)~,~M = 12 n=4,(p1,p2,p3,p4)=(10,15,6,4) , (w1,w2,w3,w4)=(4,6,2,3) , M=12
用动态规划的算法解之(写出步骤和最优解)
递推方程:
DP[i][j] = max{DP[i-1][j] , if not choose i
DP[i-1][j-w_i]+p_1 , if choose i and if j>w_i
物品/体积 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 |
2 | 0 | 0 | 0 | 0 | 10 | 10 | 15 | 15 | 15 | 15 | 25 | 25 | 25 |
3 | 0 | 0 | 6 | 6 | 10 | 10 | 16 | 16 | 21 | 21 | 21 | 21 | 21 |
4 | 0 | 0 | 6 | 6 | 10 | 10 | 16 | 16 | 21 | 21 | 21 | 25 | 25 |
3,证明Kruskal算法对于每一个加权无向连通图都产生一棵最小生成树。
证明:设T是用 K r u s k a l Kruskal Kruskal算法生成 G G G的一个生成树,而 T ′ T^{\prime} T′是一棵最优生成树且使得 ∣ E ( T ′ ) ∩ E ( T ) ∣ |E(T^{\prime})\cap E(T)| ∣E(T′)∩E(T)∣最大,用 E ( T ) E(T) E(T)表示树T的边集, w ( e ) w(e) w(e)表示边e的权值,而边集E的权值用 w ( E ) w(E) w(E)表示,以下证明 E ( T ) = E ( T ′ ) E(T) = E(T^{\prime}) E(T)=E(T′),反假设 E ( T ) ≠ E ( T ′ ) E(T)\neq E(T^{\prime}) E(T)=E(T′),因为 ∣ E ( T ) ∣ = ∣ E ( T ′ ) ∣ |E(T)|=|E(T^{\prime})| ∣E(T)∣=∣E(T′)∣,所以 E ( T ) E(T) E(T) E ( T ′ ) E(T^{\prime}) E(T′)没有包含关系,设e是 E ( T ) / E ( T ′ ) E(T)/E(T^{\prime}) E(T)/E(T′)中权值最小的边,将e添加到 E ( T ′ ) E(T^{\prime}) E(T′)中即得到 E ( T ′ ) E(T^{\prime}) E(T′)的一个圈 e 1 , e 2 , . . . , e k e_1,e_2,...,e_k e1,e2,...,ek,因为T是树,诸 e i e_i ei中至少有一个e不属于 E ( T ) E(T) E(T)。不妨设 e i e_i ei不属于 E ( T ) E(T) E(T),则必然有 w ( e ) ⩽ w ( e i ) w(e)\leqslant w(e_i) w(e)⩽w(ei)。否则,由 w ( e ) > w ( e i ) w(e)>w(e_i) w(e)>w(ei)以及 E ( T ) E(T) E(T)中比e小的边都在 E ( T ′ ) E(T^{\prime}) E(T′)中, e i e_i ei与这些边一起不含有圈,因而,按照 K r u s k a l Kruskal Kruskal算法, e i e_i ei将被选择到 E ( T ) E(T) E(T)中,矛盾。在 T ′ T^{\prime} T′中去掉一些边 e i e_i ei换上边e,得到一棵新的生成树 T ′ ′ T^{\prime \prime} T′′,这棵树有两个特点:
(1): T ′ ′ T^{\prime \prime} T′′的权值不大于 T ′ T^{\prime} T′的权值,因而与 T ′ T^{\prime} T′有相等的权值;
(2): ∣ E ( T ′ ′ ) ∩ E ( T ) ∣ > ∣ E ( T ′ ) ∩ E ( T ) ∣ |E(T^{\prime \prime})\cap E(T)| > |E(T^{\prime}) \cap E(T)| ∣E(T′′)∩E(T)∣>∣E(T′)∩E(T)∣
(1)说明 T ′ ′ T^{\prime \prime} T′′也是一棵最优生成树,而(2)说明与 T ′ T^{\prime} T′的取法相悖论,因此 E ( T ) = E ( T ′ ) E(T) = E(T^{\prime}) E(T)=E(T′),T是最优生成树。
4,
(1):说明0/1背包问题时NP问题
答:对于0/1背包问题,对其解的任何猜想,子需要进行n次加操作,再进行一次比较操作,就可以验证是否是判定模式的解,可以在多项式时间内完成,判定模式是NP问题。
(2)假定划分问题是NPC问题,证明0/1背包也是NPC问题
证明:(限制法) 由上述可知0/1背包问题是NP问题,这里我们考虑特殊的0/1背包问题:对于所有的 x ∈ X x\in X x∈X,有 w ( x ) = p ( x ) w(x) = p(x) w(x)=p(x),且取 M = K = 1 2 ∑ x ∈ X w ( x ) M = K = \frac{1}{2}\sum _{x\in X}w(x) M=K=21∑x∈Xw(x),显然,这个0/1背包问题回答为是当且仅当集合X的划分问题回答为是,可见划分问题是0/1背包问题的特例,由划分问题是NPC问题可得0/1背包问题也是NPC问题。
5,优先队列分治限界法的旅行商问题的计算
看图说话
6,深度优先与宽度优先搜索的次序标注
答:easy
7,中位数问题,带权中位数问题
(1),证明, x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn的不带权的中位数是带权 w i = 1 n w_i = \frac{1}{n} wi=n1的带权中位数
(2),在 O ( n log n ) O(n\log n) O(nlogn)的时间复杂度下求出带权中位数
答:先将序列排序,然后从前向后搜索遍历数组,并将遍历序列的元素的权重想加,知道所有的权重和>0.5,返回当前的元素,则该数就是带权中位数
(3), O ( n ) O(n) O(n)时间复杂度的算法
答:与查找中位数的算法类似,我们只需要在n个元素中找到较小的k个元素,将他们的权重想加,使得他们的和<1/2,而后n-k-1个元素的权重和<1/2
S L < p i v o t S V = p i v o t S R = p i v o t , , k < s l , , k < = s l + s v , k < s l + s v + s r SL
时间复杂度: T ( n ) < T ( n 2 ) + O ( n ) = O ( n ) T(n) < T(\frac{n}{2}) +O(n) = O(n) T(n)<T(2n)+O(n)=O(n)
8,回溯法求解0/1背包问题的解空间树的子树问题
img2
10,整数规划问题转换成为0/1背包问题
整数规划问题是:
max ∑ 1 ⩽ i ⩽ n p i x i \max \sum_{1\leqslant i \leqslant n} p_ix_i max1⩽i⩽n∑pixi
s . t . ∑ 1 ⩽ i ⩽ n w i x i ⩽ c , x i 取非负整数 , i = 1 , 2 , . . . , n s.t. ~ \sum_{1\leqslant i \leqslant n} w_ix_i \leqslant c~,~ x_i \text{取非负整数},i=1,2,...,n s.t. 1⩽i⩽n∑wixi⩽c , xi取非负整数,i=1,2,...,n
能否将整数规划问题转换成为0/1背包问题?若能,叙述你的方法:
答:
这是整数背包问题,类似于0/1背包问题,很容易证明其满足最优子结构的性质:
假设 y 1 , y 2 , . . . , y n y_1,y_2,...,y_n y1,y2,...,yn是原问题的最优解,则 y 1 , y 2 , . . . , y n − 1 y_1,y_2,...,y_{n-1} y1,y2,...,yn−1将是问题
max ∑ 1 ⩽ i ⩽ n n − 1 p i x i \max \sum_{1\leqslant i \leqslant n}^{n-1} p_ix_i max1⩽i⩽n∑n−1pixi
s . t . ∑ 1 ⩽ i ⩽ n n − 1 w i x i ⩽ c , x i 取非负整数 , i = 1 , 2 , . . . , n s.t. ~ \sum_{1\leqslant i \leqslant n}^{n-1} w_ix_i \leqslant c~,~ x_i \text{取非负整数},i=1,2,...,n s.t. 1⩽i⩽n∑n−1wixi⩽c , xi取非负整数,i=1,2,...,n
的最优解,如不然,假设 y 1 ′ , y 2 ′ , . . . , y n − 1 ′ y_1^{\prime},y_2^{\prime},...,y_{n-1}^{\prime} y1′,y2′,...,yn−1′是最优解,则 ∑ i = 1 n − 1 c i y i ′ > ∑ i = 1 n − 1 c i y i \sum_{i=1}^{n-1}c_iy_i^{\prime} > \sum_{i=1}^{n-1}c_iy_i ∑i=1n−1ciyi′>∑i=1n−1ciyi,则 ∑ i = 1 n − 1 a i y i ′ + a n y n ⩽ b \sum_{i=1}^{n-1}a_iy_i^{\prime} + a_ny_n \leqslant b ∑i=1n−1aiyi′+anyn⩽b,那么 y 1 ′ , y 2 ′ , . . . , y n − 1 ′ , y n y_1^{\prime},y_2^{\prime},...,y_{n-1}^{\prime},y_n y1′,y2′,...,yn−1′,yn将是原问题的最优解,且 ∑ i = 1 n − 1 c i y i ′ + c n y n > ∑ i = 1 n c i y i \sum_{i=1}^{n-1}c_iy_i^{\prime} + c_ny_n > \sum_{i=1}^nc_iy_i ∑i=1n−1ciyi′+cnyn>∑i=1nciyi,与原假设矛盾,故其满足最优子结构的性质。
动态规划转移方程可以写作为:
D P [ i ] [ j ] = max { D P [ i − 1 ] [ j − x i ∗ w i ] + x i ∗ p i , D P [ i − 1 ] [ j ] } DP[i][j] = \max \lbrace DP[i-1][j-x_i*w_i] + x_i*p_i ~,~DP[i-1][j]\rbrace DP[i][j]=max{DP[i−1][j−xi∗wi]+xi∗pi , DP[i−1][j]}
11,动态规划多段图问题(即求从源点s到目标点t的最短路径)
多段图: G ( V , E ) G(V,E) G(V,E),顶点集V被划分成为k>2个不相交的子集
(1):说明多段图具有最优子结构的性质
证明:见图说话
(2):写出多段图问题的最优值的递推公式
COST(i,j)表示i段中顶点j到目标点t的最短路径长度
C O S T ( i , j ) = min l ∈ v i + 1 , ( j , l ) ∈ E { c ( j , l ) + C O S T ( i + 1 , l ) } COST(i,j) = \min_{l\in v_{i+1},(j,l)\in E}\lbrace c(j,l)+COST(i+1,l)\rbrace COST(i,j)=minl∈vi+1,(j,l)∈E{c(j,l)+COST(i+1,l)}
备忘录算法:
BCOST(i,j)表示源点s到i段中节点j的最短路径长度
B C O S T ( i , j ) = min l ∈ v i − 1 , ( l , j ) ∈ E { B C O S T ( i − 1 , l ) + c ( l , j ) } BCOST(i,j) = \min_{l \in v_{i-1},(l,j)\in E} \lbrace BCOST(i-1,l)+c(l,j) \rbrace BCOST(i,j)=minl∈vi−1,(l,j)∈E{BCOST(i−1,l)+c(l,j)}
(3):给出下列图问题的一个最优解并写出基本的计算步骤
12,假定已知“无向图的Hamilton圈”问题是NPC问题,证明“旅行商判定问题”也是NPC问题,说明“旅行商最优问题”不是NPC问题。
答:看讲义,记住即可
13,证明prime算法生成的也是最优生成树
答:证明方法类似于kruskal算法的正确性证明
14,给出分治限界法旅行商问题的优先级函数与限界函数
答:…………………………………………
15,最大子段和问题
(1),分治算法求解最大子段和问题
答:
def Maxsum(nums,left,right):
if left == right:
return nums[left]>0?nums[left]:0
mid = (left+right)/2
sum1 = Maxsum(nums,left,mid)
sum2 = Maxsum(nums,mid+1,right)
s1 = 0
lefts = 0
for i in range(mid,left,-1):
lefts+=nums[i]
if lefts > s1:
s1 = lefts
s2 = 0
rights = 0
for i in range(mid+1,right):
rights+=nums[i]
if rights>s2:
s2 = rights
return max(sum1,sum2,s1+s2)
时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)
(2),说明最大子段和具有最优子结构的性质
答:截图,这个证明的关键在于子问题的设置
(3),动态规划算法解决最大子段和问题
答:DP[i] 表示包含第i个元素时的最大子段和
D P [ i ] = m a x { D P [ i − 1 ] + A [ i ] , A [ i ] } DP[i] = max\lbrace DP[i-1] + A[i] ~,~ A[i] \rbrace DP[i]=max{DP[i−1]+A[i] , A[i]}
16,0/1整数规划问题
例:给定一个 m ∗ n m*n m∗n的矩阵A和一个m元整数向量b
问:是否存在一个n元0/1向量x,使得 A x ⩽ b ? Ax \leqslant b ? Ax⩽b?
试证明0/1整数规划问题是NPC问题
17,相遇集问题
例:给定集合S的一个子集族C和一个正整数K
问:S是否包含子集 S ′ , ∣ s ′ ∣ ⩽ K S^{\prime}~,~|s^{\prime}|\leqslant K S′ , ∣s′∣⩽K,使得 S ′ S^{\prime} S′与C中的任何一个子集的交集非空, S ′ S^{\prime} S′成为C的相遇子集
证明相遇集问题是P还是NPC
18,独立集问题
例:对于给定的无向图 G = ( V , E ) G = (V,E) G=(V,E)和正整数 k ( ⩽ ∣ V ∣ ) k(\leqslant |V|) k(⩽∣V∣)
问:G中是否包含一个于k-独立集 V ′ V^{\prime} V′,即是否存在一个子集 V ′ ⊆ V , ∣ V ′ ∣ = k V^{\prime} \subseteq V~,~|V^{\prime}| = k V′⊆V , ∣V′∣=k,使得 V ′ V^{\prime} V′中的任何两个顶点在图G中都不相邻
证明:独立集问题是NPC问题
19,说明0/1背包问题是NP困难问题
19,近似算法中的一些选择填空题
(1),近似算法与NP-难问题:近似算法是求解NP-难问题的一种重要途径
(2),
20,启发式算法中的一些选择填空题
(1),定义:一个基于直观或经验构造的算法,在可接受的花费(计算时间、占用空间)下给出待解决问题实例的一个可行解,该可行解与最优解的偏离程度不一定事先可以预计。
(2),禁忌搜索算法,基本思想:用一个禁忌表记录下已经到达过的局部最优点,在下一次搜索中,禁忌表中的信息不再或有选择地搜索这些点,以此来跳出局部最优点。
(3),模拟退火算法,局部搜索算法的扩展,以一定的概率选择邻域中费用值大的状态(求最小)。理论上是一个全局最优算法。
(4),遗传算法(GA)
21,概率算法中的一些选择填空题
(1),数值概率算法
常用于数值问题的求解。这类算法所得到的往往是问题的近似解。近似解的精度随着 时间的增加而不断增加。在很多情况下,求解精确解不可能或不必要,此法可得相当满意的解。
(2),舍伍德算法
虽然在某些步骤引入随机选择,但该算法总能求得问题的一个解,且所求得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其平均情况下的计算复杂性有较大差别时,可在确定性算法中引入随机性将它改造成一个舍五德算法,消除或减少问题的好坏实例间的差别。 精髓:消除最坏情形与特定实例之间的关联性。
(3),拉斯维加斯算法
该算法不会得到不正确的解。一旦用拉斯维加斯找到一个解,这个解一定是正确解。但有时该算法找不到解。找到解的概率随它所用时间的增加而提高。对所求解的任一实例,用同一拉斯维加斯算法求解足够多次,可使求解失败概率任意小。
(4),蒙特卡罗算法
蒙特卡罗算法用于求问题的准确解。有些问题近似解没有意义,如“y/n”的判定问题、求一个整数的因子等。用蒙特卡罗算法总能求得一个解,但这个解未必是正确的。求得正确解的概率随它所用的计算时间增加而提高。一般情况下,无法有效判定所得解是否肯定正确。
1,使用回溯算法实现G的所有4着色的算法
1,Hamilton回路问题
例:已知一个图G(V,E)
问:G含有一个Hamilton回路么?G的hamilton回路是指包含图G中的所有顶点的简单回路(圈),即是G的一个顶点的一个排序: [ v 1 , v 2 , . . . , v n ] [v_1,v_2,...,v_n] [v1,v2,...,vn],其中 n = ∣ V ∣ n=|V| n=∣V∣,使得对于所有的$i:1\leqslant i < n, \lbrace v_i,v_{i+1} \rbrace\in E ,\lbrace v_n,v_1\rbrace \in E $
2,划分问题
例:已知一个有限集合A以及对于每一个 a ∈ A a \in A a∈A的一个权值 s ( a ) ∈ Z + s(a) \in Z^+ s(a)∈Z+
问:是否存在A的一个子集 A ‘ ⊆ A A^{‘} \subseteq A A‘⊆A,使得 ∑ a ∈ A ‘ s ( a ) = ∑ a ∈ A A ‘ s ( a ) \sum_{a\in A^{‘}}s(a) = \sum_{a\in \frac{A}{A^{‘}}}s(a) ∑a∈A‘s(a)=∑a∈A‘As(a)
3,三元可满足性问题(3SAT)
例:给定布尔变量的一个有限集合U以及定义在上面的子句集合 C = { c 1 , c 2 , . . . , c m } C = \lbrace c_1,c_2,...,c_m\rbrace C={c1,c2,...,cm},其中, ∣ c i ∣ = 3 , i = 1 , 2 , . . . , m |c_i| = 3,i=1,2,...,m ∣ci∣=3,i=1,2,...,m
问:是否存在U上的一个真赋值,使得C中所有的子句均被满足?
4,顶点覆盖问题
例:给定一个图 G ( V , E ) G(V,E) G(V,E),和一个正整数 K ⩽ ∣ V ∣ K\leqslant |V| K⩽∣V∣
问:是否存在G的一个顶点不超过K的覆盖?即是否存在一个顶点子集 V ‘ ⊆ V V^{‘}\subseteq V V‘⊆V, ∣ V ‘ ∣ ⩽ K |V^{‘}|\leqslant K ∣V‘∣⩽K,使得对于每一条边 { u , v } ∈ E \lbrace u,v\rbrace \in E {u,v}∈E,u与v中是少有一个属于 V ‘ V^{‘} V‘
5,三元精确覆盖问题
6,三维匹配问题