算法导论第七章答案
算法导论思考题7_2对区间的模糊排序
算法导论思考题7_2对区间的模糊排序
这个学期在做算法设计课的助教,很多题以前做过就忘记了,重做特地记录下。
《算法导论》chapter7 problem7-6对区间的模糊排序
考虑这样⼀种排序问题,即⽆法准确的知道等排序的各个数字到底是多⼤.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的⽬标是对这些区间进⾏模糊排序(fuzzy-sort),亦即,产⽣各区间的⼀个排序,使得存在⼀个 cj ∈[ai, bi ],满⾜c1≤c2≤…≤cn .
a)为n个区间的模糊排序设计⼀个算法,你的算法应该具有算法的⼀般结构,它可以快速排序左部端点(即各ai ),也要能充分利⽤重叠区间来改善运⾏时间.(随着各区间重叠得越来越多,对各区间的排序的问题会变得越来越容易,你的算法应该能充分利⽤这种重叠.) b)证明: 在⼀般情况下,你的算法的区望运⾏时间为 O(n*lgn),但当所有的区间都重叠时,期望的运⾏时间为O(n) (亦即,当存在⼀个值 x, 使得对所有的 i, 都有x∈[ai, bi ] ).你的算法不应显式的检查这种情况,⽽是应当随着重叠量的增加,性能⾃然地有所改善. 解答
a. 算法思想基本是仿快速排序对区间进⾏排序。难点在于如何充分利⽤重叠区间来改善运⾏时间?其关键在于Partion()的设计。
对于如何充分利⽤重叠区间,解决思路是在调⽤Partion()划分时,区间如果重叠的部分,就把它们看做是相等的,并提取公共部分继续划分。即对于区间[ai,bi],[aj,bj],它们⼤⼩分为三种情况。 if(bi
else if(bj
else [ai,bi]=[aj,bj]。
⽹上其它⼈的解答,思路都是类似的,不过看了⼏个版本,不少⼈在代码实现上多少有点bug。⼀个易错的地⽅是在判定两个区间相等的情况后,要提取它们公共区域继续划分。另⼀个错误有点难描述,以下⾯的代码为例,在else if(interArr[k].a>midInterval.b){}⾥⾯,没有加上“k--”这⼀⾏代码。⾄于什么要加⼀⾏代码,因为在interArr[k]⽐基准midInterval⼤⽽需要Exchange时,和interArr[j]交换时,interArr[j]也可能⽐基准midInter⼤的。我们如果不k--,那么就会直接跳过去了。这样说如果有点模糊的话,可以拿下⾯数据模拟⼀次就明⽩了。28508 31359
算法导论第7章
算法导论第7章
看CLRS⼀般把笔记写在书的margin⾥。Cormen的提纲也是蛮好的,适合复习。这⾥⽤的Partition⽅法是Lomuto Partition,不是原始的也
是第1版中的Hoare Partition。后者被留作习题。快排Quicksort的时间复杂度worst-case是\Theta(n^2), 期望时间是\Theta(nlgn), 复杂度前⾯
的常数很⼩,sort in place。
Descriptions of quicksort
快排是Divide-and-conquer的典范。
Divide: ⽤pivot把数组划分为两半A[p,…,q-1]和A[q+1,…,r]。前⾯的数组⽐A[q]⼩,后⾯的数组⽐A[q]⼤。
Conquer: 递归调⽤quicksort
Combie: 不需要,sort in place
⽤来划分的函数叫做PARTITION,返回下标q。
Quicksort函数
def QUICKSORT(A, p, r):
if p < r:
q = PARTITION(A, p, r)
QUICKSORT(A, p, q - 1)
QUICKSORT(A, q + 1, r)
Python美~
PARTITION函数
def PARTITION(A, p, r ):
x = A[r ]
i = p - 1
for j = p to r - 1:
if A[ j ] <= x:
i = i + 1
exchange A[i ] - A[ j ]
exchange A[i + 1] - A[r ] return i + 1
PARTITION总是选取最后⼀个元素作为pivot,习题中可以⽤Median of 3优化,要求我们计算划分good split的概率提供了多少。
没有优化的PARTITION有可能使得划分到的2个数组有1个为空
原⽂⽤Loop invariant证明PARTITION正确性,Initialization,Maintenance,Termination,blablabla……。时间复杂度是\Theta(n)
《算法导论》笔记第7章7.4快速排序分析
《算法导论》笔记第7章7.4快速排序分析
【笔记】
利⽤RANDOMIZED-PARTITION,快速排序算法期望的运⾏时间当元素值不同时,为O(nlgn)。
【练习】
7.4-1 证明:在递归式:
中,T(n)=Ω(n^2)。
采⽤代换法。
猜测 T(n) <= c*n^2,c为某个常数。
选择⾜够⼤的c,使得 c*(2*n-1)可以⽀配Θ(n), T(n) <= c*n^2成⽴。
7.4-2 证明:快速排序的最佳情况运⾏时间为Ω(nlgn)。
7.4-3 证明:在q=0,1,...,n-1区间上,当q=0或q=n-1时,q^2+(n-q-1)^2取得最⼤值。
令x=q
⼀元⼆次函数,开⼝向上,x=(n-1)/2 为对称轴。
因为 0<=q<=n-1,所以x=0或x=n-1时,y取得最⼤值,即q^2+(n-q-1)^2取得最⼤值。
7.4-4 证明:RANDOMIZED-QUICKSORT 算法的期望运⾏时间是Ω(nlgn)。
随机化还没看=。=
7.4-5 当在⼀个长度⼩于k的⼦数组上调⽤快速排序时,让他不做任何排序就返回。当顶层的快速排序调⽤返回后,对整个数组运⾏插⼊排序来完成排序过程。证明这⼀排序算法的期望运⾏时间为O(nk+nlg(n/k))。在理论上和实践中,应如何选择k。
算法的时间由快速排序与插⼊排序两部分组成。
对于快速排序,递归树由logn变为logn-logk因此复杂度为O(nlog(n/k))。
对于插⼊排序,设快速排序将数组分为m份,每份Ki个元素,Ki<=k,∑Ki=n。O(∑Ki*Ki) <= O(∑Ki*k) = O(k*∑Ki) = O(n*k)。
因此期望运⾏时间为O(nk+nlg(n/k))。k的值理论在logn附近,实验中在⾮理论值附近选择k也可能最优。
*7.4-6 考虑对PARTITION过程做这样的修改:从数组A中随机的选择出三个元素,并围绕这三个数的中数对它们进⾏划分。求出以α的函数形式表⽰的、最坏情况中α:(1-α)划分的近似概率。*
《算法导论》习题答案
《算法导论》习题答案
Chapter2 Getting Start
2.1 Insertion sort
2.1.2 将Insertion-Sort重写为按非递减顺序排序
2.1.3 计算两个n位的二进制数组之和 2.2 Analyzing algorithms
2.2.1将函数用符号表示
2.2.2写出选择排序算法selection-sort 当前n-1个元素排好序后,第n个元素
已经是最大的元素了.
最好时间和最坏时间均为 2.3 Designing algorithms
计算递归方程的解
(1) 当时,,显然有T(
(2) 假设当时公式成立,即,
则当,即时,
2.3.4 给出insertion sort的递归版本的递归式
2.3-6 使用二分查找来替代insertion-sort中while循环j?n;
if A[i]+A[j]<x
i?i+1
else
j?j-1
if A[i]+A[j]=x
return true
else return false
时间复杂度为。
或者也可以先固定一个元素然后去二分查找x减去元素的差,复杂度为
。 Chapter3 Growth of functions 3.1Asymptotic notation
3.1.2证明对于b
时,
对于,
时,
存在,当时,
对于,
3.1-4 判断与22n是否等于O(2n)
3.1.6 证明如果算法的运行时间为,如果其最坏运行时间为O(g(n)),最
佳运行时间为。
最坏时间O(g(n)),即;
最佳时间,即
3.1.7:证明
定义 3.2 Standard notation and common functions
3.2.2 证明
证明
当n>4时,,
是否多项式有界 ~与
设lgn=m,
则?lgn~不是多项式有界的。 meme
算法导论习题解答2.3-7
算法导论习题解答2.3-7
•2.3-7 请给出⼀个运⾏为Θ(nlgn)的算法(伪码),使之能在给定⼀个由n个整数构成的集合S和另⼀个整数x时,判断出S中是否存在有两个其和等于x的元素。
解:解题思路:先对集合S进⾏归并排序,然后新建⼀个数组S1,使得S1[i] = x – S[i],再将两个数组并起来。如果在并的过程中发现有两个元素相等且两个元素⼀个来⾃S,⼀个来⾃S1,则可以确定S中存在有两个其和等于x的元素。Find whether x exits
1、Sort(S)
2、for i <- 0 to Length(S) – 1
3、 do S1[i] <- x - S[i]
4、for i <- 0 to Length(S) – 1
5、 do Merge( S,S1 )
6、 if S[p] > S1[q]
7、 S0[k] <- S[p] p++ k++
8、 if S[p] < S1[q]
9、 S0[k] <- S[q] q++ k++
10、 if S[p] == S1[q]
11、 return true
12、return false
在第⼀⾏进⾏排序时,时间代价为Θ(nlgn),后来的合并过程时间代价为Θ(n),总的时间代价为Θ(nlgn)。
《算法导论》习题答案 2
Chapter2 Getting Start
2.1 Insertion sort
2.1.2 将Insertion-Sort重写为按非递减顺序排序
2.1.3 计算两个n位的二进制数组之和
2.2 Analyzing algorithms
2.2.1将函数32/10001001003nnn用符号表示
2.2.2写出选择排序算法selection-sort
当前n-1个元素排好序后,第n个元素已经是最大的元素了.
最好时间和最坏时间均为2()n
2.3 Designing algorithms
2.3.3 计算递归方程的解22()2(/2)2,1kifnTnTnnifnfork
(1) 当1k时,2n,显然有()lgTnnn
(2) 假设当ki时公式成立,即()lg2lg22iiiTnnni,
则当1ki,即12in时, 111111()(2)2(2)222(1)22lg(2)lgiiiiiiiiTnTTiinn
()lgTnnn
2.3.4 给出insertion sort的递归版本的递归式
(1)1()(1)()1ifnTnTnnifn
2.3-6 使用二分查找来替代insertion-sort中while循环内的线性扫描,是否可以将算法的时间提高到(lg)nn?
虽然用二分查找法可以将查找正确位置的时间复杂度降下来,但是移位操作的复杂度并没有减少,所以最坏情况下该算法的时间复杂度依然是2()n
2.3-7 给出一个算法,使得其能在(lg)nn的时间内找出在一个n元素的整数数组内,是否存在两个元素之和为x
首先利用快速排序将数组排序,时间(lg)nn,然后再进行查找:
Search(A,n,x)
QuickSort(A,n);
算法导论习题答案 (1)
Introduction to Algorithms September 24, 2004
Massachusetts Institute of Technology 6.046J/18.410J
Professors Piotr Indyk and Charles E. Leiserson Handout 7
Problem Set 1 Solutions
Exercise 1-1. Do Exercise 2.3-7 on page 37 in CLRS.
Solution:
The following algorithm solves the problem:
1.Sort the elements in Susing mergesort.
2.Remove the last element from S. Let ybe the value of the removed element.
3.If Sis nonempty, look for z= x− yin Susing binary search.
4.If Scontains such an element z, then STOP, since we have found yand zsuch that x= y+ z.
Otherwise, repeat Step 2.
5.If Sis empty, then no two elements in Ssum to x.
Notice that when we consider an element yi of Sduring ith iteration, we don’t need to look at the
elements that have already been considered in previous iterations. Suppose there exists yj ∗ S,
