算法导论第三版答案
算法导论第三版第二章第一节习题答案

算法导论第三版第⼆章第⼀节习题答案2.1-1:以图2-2为模型,说明INSERTION-SORT在数组A=<31,41,59,26,41,58>上的执⾏过程。
NewImage2.1-2:重写过程INSERTION-SORT,使之按⾮升序(⽽不是按⾮降序)排序。
注意,跟之前升序的写法只有⼀个地⽅不⼀样:NewImage2.1-3:考虑下⾯的查找问题:输⼊:⼀列数A=<a1,a2,…,an >和⼀个值v输出:下标i,使得v=A[i],或者当v不在A中出现时为NIL。
写出针对这个问题的现⾏查找的伪代码,它顺序地扫描整个序列以查找v。
利⽤循环不变式证明算法的正确性。
确保所给出的循环不变式满⾜三个必要的性质。
(2.1-3 Consider the searching problem:Input: A sequence of n numbers A D ha1; a2; : : : ;ani and a value _.Output: An index i such that _ D AOEi_ or the special value NIL if _ does not appear in A.Write pseudocode for linear search, which scans through the sequence, looking for _. Using a loop invariant, prove that your algorithm is correct. Make sure that your loop invariant fulfills the three necessary properties.)LINEAR-SEARCH(A,v)1 for i=1 to A.length2 if v = A[i]3 return i4 return NIL现⾏查找算法正确性的证明。
算法导论 第三版 第七章 答案 英

Exercise 7.2-4
Let’s say that by “almost sorted” we mean that A[i] is at most c positions from its correct place in the sorted array, for some constant c. For INSERTIONSORT, we run the inner-while loop at most c times before we find where to insert A[j] for any particular iteration of the outer for loop. Thus the running time time is O(cn) = O(n), since c is fixed in advance. Now suppose we run QUICKSORT. The split of PARTITION will be at best n − c to c, which leads to O(n2) running time.
Chapter 7
Michelle Bodnar, Andrew Lohr
April 12, 2016
Exercise 7.1-1
13 19 9 5 12 8 7 4 21 2 6 11 13 19 9 5 12 8 7 4 21 2 6 11 13 19 9 5 12 8 7 4 21 2 6 11 9 19 13 5 12 8 7 4 21 2 6 11 9 5 13 19 12 8 7 4 21 2 6 11 9 5 13 19 12 8 7 4 21 2 6 11 9 5 8 19 12 13 7 4 21 2 6 11 9 5 8 7 12 13 19 4 21 2 6 11 9 5 8 7 4 13 19 12 21 2 6 11 9 5 8 7 4 13 19 12 21 2 6 11 9 5 8 7 4 2 19 12 21 13 6 11 9 5 8 7 4 2 6 12 21 13 19 11 9 5 8 7 4 2 6 11 21 13 19 12 Exercise 7.1-2
算法导论 第三版 第九章 答案 英

2Hale Waihona Puke is less than roughly 4n/14 of the elements. So, we are never calling it recursively on more than 10n/14 elements. So, T (n) ≤ T (n/7) + T (10n/14) + O(n). So, we can show by substitution this is linear. Suppose T (n) < cn for n < k , then, for m ≥ k , T (m) ≤ T (m/7) + T (10m/14) + O(m) ≤ cm(1/7 + 10/14) + O(m). So, as long as we have that the constant hidden in the big-Oh notation is less than c/7, we have the desired result. Suppose now that we use groups of size 3 instead. So, For similar reasons, we have that the recurrence we are able to get is T (n) = T ( n/3 ) + T (4n/6) + O(n) ≥ T (n/3) + T (2n/3) + O(n). So, we will show it is ≥ cn lg(n). T (m) ≥ c(m/3) lg(m/3) + c(2m/3) lg(2m/3) + O(m) ≥ cm lg(m) + O(m). So, we have that it grows more quickly than linear. Exercise 9.3-2 We know that the number of elements greater than or equal to x and the number of elements less than or equal to x is at least 3n/10 − 6. Then for n ≥ 140 we have 3n/10 − 6 = Exercise 9.3-3 We can modify quicksort to run in worst case n lg(n) time by choosing our pivot element to be the exact median by using quick select. Then, we are guaranteed that our pivot will be good, and the time taken to find the median is on the same order of the rest of the partitioning. Exercise 9.3-4 Create a graph with n vertices and draw a directed edge from vertex i to vertex j if the ith and j th elements of the array are compared in the algorithm and we discover that A[i] ≥ A[j ]. Observe that A[i] is one of the i − 1 smaller elements if there exists a path from x to i in the graph, and A[i] is one of the n − i larger elements if there exists a path from i to x in the graph. Every vertex i must either lie on a path to or from x because otherwise the algorithm can’t distinguish between i ≤ x and i ≥ x. Moreover, if a vertex i lies on both a path to x and a path from x then it must be such that x ≤ A[i] ≤ x, so x = A[i]. In this case, we can break ties arbitrarily. Exercise 9.3-5 To use it, just find the median, partition the array based on that median. If i is less than half the length of the original array, recurse on the first half, if i is half the length of the array, return the element coming from the median finding 3 n n + − 6 ≥ n/4 + 140/20 − 6 = n/4 + 1 ≥ n/4 . 4 20
算法导论第九章习题答案(第三版)IntroductiontoAlgorithm

算法导论第九章习题答案(第三版)IntroductiontoAlgorithm Exercise
9.1-1
对所有的元素,两个⼀组进⾏⽐较,共需n-1次⽐较,可以构成⼀棵⼆叉树,最⼩的元素在树的根结点上,接下来,画出⼆叉树,可以很容易的看出共需lgn-1次⽐较,所以共需n+lgn-2次⽐较才可以找出第⼆⼩的元素。
9.1-2
略。
9.2-1
在randomized-select中,对于长度为0的数组,此时p=r,直接返回A[p],所以不会进⾏递归调⽤。
9.2-2
略。
9.2-3
RANDOMIZED-SELECT(A,p,r,i){
while(true){
if(p==r)
return A[p];
q=RANDOMIZED-PARTITION(A,p,r);
k=q-p+1;
if(i==k)
return A[q];
else if(i<k)
q--;
else{
q++;
i-=k;
}
}
}
9.2-4
每次都以最⼤的元素进⾏划分即可。
9.3-1
数学计算,根据书中例题仿照分析即可。
9.3-3
随机化
9.3-5
类似主元划分,只要把⿊箱⼦输出的值作为主元划分去选择即可。
9.3-6
多重⼆分即可。
9.3-7
算出中位数,之后算出每⼀个数与中位数的差即可。
9.3-8
分别取两个数组的中位数进⾏⽐较,如果两个中位数相等,那么即为所求,否则,取中位数较⼩的⼀个的右边,取较⼤的⼀个的右边,直到就剩4个元素为⽌,这时候只要求这4个元素的中位数即可。
算法导论第三版第六章答案英

算法导论第三版第六章答案英Chapter6Michelle Bodnar,Andrew LohrDecember31,2016Exercise6.1-1At least2h and at most2h+1?1.Can be seen because a complete binarytree of depth h?1hasΣh?1i=02i=2h?1elements,and the number of elementsin a heap of depth h is between the number for a complete binary tree of depth h?1exclusive and the number in a complete binary tree of depth h inclusive.Exercise6.1-2Write n=2m?1+k where m is as large as possible.Then the heap consists of a complete binary tree of height m?1,along with k additional leaves along the bottom.The height of the root is the length of the longest simple path to one of these kleaves,which must have length m.It is clear from the way we de?ned m that m= lg n .Exercise6.1-3If there largest element in the subtee were somewhere other than the root, it has a parent that is in the subtree.So,it is larger than it’s parent,so,the heap property is violated at the parent of the maximum element in the subtreeExercise6.1-4The smallest element must be a a leaf node.Suppose that node x contains the smallest element and x is not a leaf.Let y denote a child node of x.By the max-heap property,the value of x is greater than or equal to the value of y.Since the elements of the heap are distinct,the inequality is strict.This contradicts the assumption that x contains the smallest element in the heap. Exercise6.1-5Yes,it is.The index of a child is always greater than the index of the parent, so the heap property is satis?ed at each vertex. 1Exercise6.1-6No,the array is not a max-heap.7is contained in position9of the array,so its parent must be in position4,which contains6.This violates the max-heap property.Exercise6.1-7It su?ces to show that the elements with no children are exactly indexed by{ n/2 +1,...,n}.Suppose that we had an i in this range.It’s childeren would be located at2i and2i+1but both of these are≥2 n/2 +2>n and so are not in the array.Now,suppose we had an element with no kids,this means that2i and2i+1are both>n,however,this means that i>n/2.This means that i∈{ n/2 +1,...,n}.Exercise6.2-1271731613101571248902717101613315712489027171016138157124830Exercise6.2-2Algorithm1MIN-HEAPIFY(A,i)1:l=LEF T(i)2:r=RIGHT(i)3:if l≤A.heap?size and A[l]4:smallest=l5:else smallest=i6:end if7:if r≤A.heap?size and A[r]8:smallest=r9:end if10:if smallest=i then11:exchange A[i]with A[smallest]12:MIN-HEAPIFY(A,smallest)13:end ifThe running time of MIN-HEAPIFY is the same as that of MAX-HEAPIFY. Exercise6.2-3The array remains unchanged since the if statement on line line8will be false.2Exercise6.2-4If i>A.heap?size/2then l and r will both exceed A.heap?size so the if statement conditions on lines3and6of the algorithm will never be satis?ed. Therefore largest=i so the recursive call will never be made and nothing will happen.This makes sense because i necessarily corresponds to a leaf node,so MAX–HEAPIFY shouldn’t alter the heap.Exercise6.2-5Iterative Max Heapify(A,i)while il=LEFT(i)r=LEFT(i)largest=iif l≤A.heap-size and A[l]>A[i]thenlargest=lend ifif l≤A.heap-size and A[r]>A[i]thenlargest=rend ifif largest=i thenexchange A[i]and A[largest]elsereturn Aend ifend whilereturn AExercise6.2-6Consider the heap resulting from A where A[1]=1and A[i]=2for 2≤i≤n.Since1is the smallest element of the heap,it must be swapped through each level of the heap until it is a leaf node.Since the heap has height lg n ,MAX-HEAPIFY has worst-case time?(lg n).Exercise6.3-1531710841962295317228419610953192284176109584192231761098451922317610984221953176109842219103176593Exercise6.3-2If we had started at1,we wouldn’t be able to guarantee that the max-heap property is maintained.For example,if the array A is given by[2,1,1,3]then MAX-HEAPIFY won’t exchange2with either of it’s children,both1’s.How-ever,when MAX-HEAPIFY is called on the left child,1,it will swap1with3. This violates the max-heap property because now2is the parent of3.Exercise6.3-3All the nodes of height h partition the set of leaves into sets of size between 2h?1+1and2h,where all but one is size2h.Just by putting all the children of each in their own part of trhe partition.Recall from6.1-2that the heap has height lg(n) ,so,by looking at the one element of this height(the root),we get that there are at most2 lg(n) leaves.Since each of the vertices of height h partitions this into parts of size at least2h?1+1,and all but one corresponds to a part of size2h,we can let k denote the quantity we wish to bound,so,(k?1)2h+k(2h?1+1)≤2 lg(n) ≤n/2sok≤n+2h2h+1+2h+1≤n2h+1≤n2h+1Exercise6.4-14513225717208451320257172845252013717284255201371728425132057172842513208717254413208717252520134871725252013178742525513178742202517135874220252135874172025132587417202513852741720254852713172025845271317202587524131720254752813172025745281317202524578131720255427813172025245781317202542578131720252457813172025Exercise6.4-2We’ll prove the loop invariant of HEAPSORT by induction:Base case:At the start of the?rst iteration of the for loop of lines2-5we have i=A.length.The subarray A[1..n]is a max-heap since BUILD-MAX-HEAP(A)was just called.It contains the n smallest elements,and the empty subarray A[n+1..n]trivially contains the0largest elements of A in sorted order.Suppose that at the start of the i th iteration of of the for loop of lines2-5, the subarray A[1..i]is a max-heap containing the i smallest elements of A[1..n] and the subarray A[i+1..n]contains the n?i largest elements of A[1..n]in sorted order.SinceA[1..i]is a max-heap,A[1]is the largest element in A[1..i]. Thus it is the(n?(i?1))th largest element from the original array since the n?i largest elements are assumed to be at the end of the array.Line3swaps A[1]with A[i],so A[i..n]contain the n?i+1largest elements of the array, and A[1..i?i]contains the i?1smallest elements.Finally,MAX-HEAPIFY is called on A,1.Since A[1..i]was a max-heap prior to the iteration and only the elements in positions1and i were swapped,the left and right subtrees ofnode1,up to node i?1,will be max-heaps.The call to MAX-HEAPIFY will place the element now located at node1into the correct position and restore the5max-heap property so that A[1..i?1]is a max-heap.This concludes the next iteration,and we have veri?ed each part of the loop invariant.By induction, the loop invariant holds for all iterations.After the?nal iteration,the loop invariant says that the subarray A[2..n] contains the n?1largest elements ofA[1..n],sorted.Since A[1]must be the n th largest element,the whole array must be sorted as desired.Exercise6.4-3If it’s already sorted in increasing order,doing the build max heap-max-heap call on line1will takeΘ(n lg(n))time.There will be n iterations of the for loop, each takingΘ(lg(n))time because the element that was at position i was the smallest and so will have lg(n) steps when doing max-heapify on line5.So, it will beΘ(n lg(n))time.If it’s already sorted in decreasing order,then the call on line one will only takeΘ(n)time,since it was already a heap to begin with,but it will still take n lg(n)peel o?the elements from the heap and re-heapify.Exercise6.4-4Consider calling HEAPSORT on an array which is sorted in decreasing order. Every time A[1]is swapped with A[i],MAX-HEAPIFY will be recursively called a number of times equal to the height h of the max-heap containing the elements of positions1through i?1,and has runtime O(h).Since there are2k nodes at height k,the runtime is bounded below bylg ni=12i log(2i)=lg ni=1i2i=2+( lg n ?1)2 lg n =?(n lg n).Exercise6.4-5Since the call on line one could possibly take only linear time(if the input was already a max-heap for example),we will focus on showing that the for loop takes n log n time.This is the case because each time that the last element is placed at the beginning to replace the max element being removed,it has to go through every layer,because it was already very small since it was at the bottom level of the heap before.Exercise6.5-1The following sequence of pictures shows how the max is extracted from the heap.1.Original heap:615 13540126298172.we move the last element to the top of theheap 3.13>9>1so,we swap1and13.4.Since12>5>1,we swap1and12.75.Since6>2>1,we swap1and6.Exercise6.5-2The following sequence of pictures shows how10is inserted into the heap, then swapped with parent nodes until the max-heap property is restored.The node containing the new key is heavily shaded.1.Original heap:815 13540126298172.MAX-HEAP-INSERT(A,10)is called,so we?rst append a node assignedvalue?∞:3.The key value of the new node is updated:4.Since the parent key is smaller than10,the nodes are swapped:95.Since the parent node is smaller than10,the nodes are swapped:Exercise6.5-3Heap-Minimum(A)1:return A[1]Heap-Extract-Min(A)1:if A.heap-size<1then2:Error“heap under?ow”3:end if4:min=A[1]5:A[1]=A[A.heap?size]6:A.heap?size??7:Min-heapify(A,1)8:return minHeap-decrease-key(A,i,key)101:if key?A[i]then2:Error“new key larger than old key”3:end if4:A[i]=key5:while i>1and A[P arent(i)]6:exchange A[i]with A[P arent(i)]7:i=P arent(i)8:end whileMin-Heap-Insert(A,key)1:A.heap?size++2:A[A.heap?size]=∞3:Heap-Decrease-Key(A,A.heap-size,key)Exercise6.5-4If we don’t make an assignment to A[A.heap?size]then it could contain any value.In particular,when we call HEAP-INCREASE-KEY,it might be the case that A[A.heap?size]initially contains a value larger than key,causing an error.By assigning?∞to A[A.heap?size]we guarantee that no error will occur.However,we could have assigned any value less than or equal to key to A[A.heap?size]and the algorithm would still work.Exercise6.5-5Initially,we have a heap and then only change the value at i to make it larger.This can’t invalidate the ordering between i and it’s children,the only other thing that needs to be related to i is that i is less than it’s parent,which may be false.Thus we have the invariant is true at initialization.Then,when we swap i with its parent if it is larger,since it is larger than it’s parent,it must also be larger than it’s sibling,also,since it’s parent was initially above its kids in the heap,we know that it’s parent is larger than it’s kids.The only relation in question is then the new i and it’s parent.At termination,i is the root,so it has no parent,so the heap property must be satis?ed everywhere.Exercise6.5-6Replace A[i]by key in the while condition,and replace line5by“A[i]= A[P ARENT(i)].”After the end of the while loop,add the line A[i]=key. Since the key value doesn’t change,there’s no sense in assigning it until we know where it belongs in the heap.Instead,we only make the assignment of the parent to the child node.At the end of the while loop,i is equal to the position where key belongs since it is either the root,or the parent is at least11key,so we make the assignment.Exercise6.5-7Have a?eld in the structure that is just a count of the total number of elements ever added.When adding an element,use thecurrent value of that counter as the key.Exercise6.5-8The algorithm works as follows:Replace the node to be deleted by the last node of the heap.Update the size of the heap,then call MAX-HEAPIFY to move that node into its proper position and maintain the max-heap property. This has running timeO(lg n)since the number of times MAX-HEAPIFY is recursively called is as most the height of the heap,which is lg n . Algorithm2HEAP-DELETE(A,i)1:A[i]=A[A.heap?size]2:A.heap?size=A.heap?size+13:MAX-HEAPIFY(A,i)Exercise6.5-9Construct a min heap from the heads of each of the k lists.Then,to?nd the next element in the sorted array,extract the minimum element(in O lg(k) time).Then,add to the heap the next element from the shorter list from which the extracted element originally came(also O(lg(k))time).Since?nding the next element in the sorted list takes only at most O(lg(k))time,to? nd the whole list,you need O(n lg(k))total steps.Problem6-1a.They do not.Consider the array A= 3,2,1,4,5 .If we run Build-Max-Heap,we get 5,4,1,3,2 .However,if we run Build-Max-Heap’,we will get 5,4,1,2,3 instead.b.Each insert step takes at most O(lg(n)),since we are doing it n times,weget a bound on the runtime of O(n lg(n)).Problem6-2a.It will su?ce to show how to access parent and child nodes.In a d-ary array,PARENT(i)= i/d ,and CHILD(k,i)=di?d+1+k,where CHILD(k,i) gives the k th child of the node indexed by i.12b.The height of a d-ary heap of n elements is with1of log d n.c.The following is an implementation of HEAP-EXTRACT-MAX for a d-aryheap.An implementation of DMAX-HEAPIFY is also given,which is the analog of MAX-HEAPIFY for d-ary heap.HEAP-EXTRACT-MAX con-sists of constant time operations,followed by a call to DMAX-HEAPIFY.The number of times this recursively calls itself is bounded by the height of the d-ary heap,so the running time is O(d log d n).Note that the CHILD function is meant to be the one described in part(a).Algorithm3HEAP-EXTRACT-MAX(A)for a d-ary heap1:if A.heap?size<1then2:error“heap under?ow”3:end if4:max=A[1]5:A[1]=A[A.heap?size]6:A.heap?size=A.heap?size?17:DMAX-HEAPIFY(A,1)Algorithm4DMAX-HEAPIFY(A,i)1:largest=i2:for k=1to d do3:if CHILD(k,i)≤A.heap?size and A[CHILD(k,i)]>A[i]then4:if A[CHILD(k,i)]>largest then5:largest=A[CHILD(k,i)]6:end if7:end if8:end for9:if largest=i then10:exchange A[i]with A[largest]11:DMAX-HEAPIFY(A,largest)12:end ifd.The runtime of this implementation of INSERT is O(log d n)since the whileloop runs at most as many times as the height of the d-ary array.Note that when we call PARENT,we mean it as de?ned in part(a).e.This is identical to the implementation of HEAP-INCREASE-KEY for2-aryheaps,but with the PARENT function interpreted as in part(a).The run-time is O(log d n)since the while loop runs at most as many times as the height of the d-ary array.13Algorithm5INSERT(A,key)1:A.heap?size=A.heap?size+12:A[A.heap?size]=key3:i=A.heap?size4:while i>1and A[P ARENT(i)5:exchange A[i]with A[P ARENT(i)]6:i=P ARENT(i)7:end whileAlgorithm6INCREASE-KEY(A,i,key)1:if key2:error“new key is smaller than current key”3:end if4:A[i]=key5:while i>1and A[P ARENT(i)6:exchange A[i]with A[P ARENT(i)]7:i=P ARENT(i)8:end whileProblem6-3a.2345 891214 16∞∞∞∞∞∞∞b.For every i,j,Y[1,1]≤Y[i,1]≤Y[i,j].So,if Y[1,1]=∞,we know thatY[i,j]=∞for every i,j.This means that no elements exist.If Y is full,it has no elements labeled∞,in particular,the element Y[m,n]is not labeled ∞.c.Extract-Min(Y,i,j),extracts the minimum value from the young tableau Yobtained by Y [i ,j ]=Y[i +i?1,j +j?1].Note that in running this algorithm,several accesses may be made out of bounds for Y,de? ne these to return∞.No store operations will be made on out of bounds locations.Since the largest value of i+j that this can be called with is n+m,and this quantity must increase by one for each call,we have that the runtime is bounded by n+m.d.Insert(Y,key)Since i+j is decreasing at each step,starts as n+m and isbounded by2below,we know that this program has runtime O(n+m). e.Place the n2elements into a Young Tableau by calling the algorithm frompart d on each.Then,call the algorithm from part c n2to obtain the numbers in increasing order.Both of these operations take time at most2n∈O(n), and are done n2times,so,the total runtime is O(n3)141:min=Y[i,j]2:if Y[i,j+1]=Y[i+1,j]=∞then3:Y[i,j]=∞4:return min5:end if6:if Y[i,j+1]7:Y[i,j]=Y[i,j+1]8:Y[i,j+1]=min9:return Extract-min(y,i,j+1)10:else11:Y[i,j]=Y[i+1,j]12:Y[i+1,j]=min13:return Extract-min(y,i+1,j)14:end if1:i=m,j=n2:Y[i,j]=key3:while Y[i?1,j]>Y[i,j]or Y[i,j?1]>Y[i,j]do 4:if Y[i?1,j]5:Swap Y[i,j]and Y[i,j?1]6:j??7:else8:Swap Y[i,j]and Y[i?1,j]9:i??10:end if11:end while15f.Find(Y,key).Let Check(y,key,i,j)mean to return true if Y[i,j]=key,oth-erwise do nothingi=j=1while Y[i,j]Check(Y,key,i,j)i++end whilewhile i>1and jCheck(i,j)if Y[i,j]j++elsei–end ifend whilereturn false16。
算法导论 第三版 第十二章 答案 英

3
Algorithm 1 PREORDER-TREE-WALK(x) if x = N IL then print x PREORDER-TREE-WALK(x.left) PREORDER-TREE-WALK(x.right) end if return Algorithm 2 POSTORDER-TREE-WALK(x) if x = N IL then POSTORDER-TREE-WALK(x.left) POSTORDER-TREE-WALK(x.right) print x end if return
Exercise 12.2-3
Algorithm 5 TREE-PREDECESSOR(x) if x.lef t = N IL then return TREE-MAXIMUM(x.left) end if y = x.p while y = N IL and x == y.lef t do x=y y = y.p end while return y Exercise 12.2-4 Suppose we search for 10 in this tree. Then A = {9}, B = {8, 10} and C = ∅, and Professor Bunyan’s claim fails since 8 < 9. 8
Chapter 12
Michelle Bodnar, Andrew Lohr April 12, 2016
Exercise 12.1-1 Anytime that a node has a single child, treat it as the right child, with the left child being NIL 10
Ch10算法导论 第三版 第十章 答案 英
Chapter10Michelle Bodnar,Andrew LohrApril12,2016Exercise10.1-14414134141841Exercise10.1-2We will call the stacks T and R.Initially,set T.top=0and R.top=n+1. Essentially,stack T uses thefirst part of the array and stack R uses the last part of the array.In stack T,the top is the rightmost element of T.In stack R, the top is the leftmost element of R.Algorithm1PUSH(S,x)1:if S==T then2:if T.top+1==R.top then3:error“overflow”4:else5:T.top=T.top+16:T[T.top]=x7:end if8:end if9:if S==R then10:if R.top−1==T.top then11:error“overflow”12:else13:R.top=R.top−114:T[T.top]=x15:end if16:end if1Algorithm2POP(S)if S==T thenif T.top==0thenerror“underflow”elseT.top=T.top−1.return T[T.top+1]end ifend ifif S==R thenif R.top==n+1thenerror“underflow”elseR.top=R.top+1.return R[R.top−1]end ifend ifExercise10.1-34414131313838Exercise10.1-4Algorithm3ENQUEUEif Q.head==Q.tail+1,or Q.head==1and Q.tail==Q.length then error“overflow”end ifQ[Q.tail]=xif Q.tail==Q.length thenQ.tail=1elseQ.tail=Q.head+1end ifExercise10.1-5As in the example code given in the section,we will neglect to check for overflow and underflow errors.2Algorithm4DEQUEUEerror“underflow”end ifx=Q[Q.head]if Q.head==Q.length thenQ.head=1elseQ.head=Q.head+1end ifreturn xAlgorithm5HEAD-ENQUEUE(Q,x) Q[Q.head]=xif Q.head==1thenQ.head=Q.lengthelseQ.head=Q.head−1end ifAlgorithm6TAIL-ENQUEUE(Q,x) Q[Q.tail]=xif Q.tail==Q.length thenQ.tail=1elseQ.tail=Q.tail+1end ifAlgorithm7HEAD-DEQUEUE(Q,x) x=Q[Q.head]if Q.head==Q.length thenQ.head=1elseQ.head=Q.head+1end ifAlgorithm8TAIL-DEQUEUE(Q,x) x=Q[Q.tail]if Q.tail==1thenQ.tail=Q.lengthelseQ.tail=Q.tail−1end if3Exercise10.1-6The operation enqueue will be the same as pushing an element on to stack 1.This operation is O(1).To dequeue,we pop an element from stack2.If stack 2is empty,for each element in stack1we pop it off,then push it on to stack2. Finally,pop the top item from stack2.This operation is O(n)in the worst case.Exercise10.1-7The following is a way of implementing a stack using two queues,where pop takes linear time,and push takes constant time.Thefirst of these ways,consists of just enqueueing each element as you push it.Then,to do a pop,you dequque each element from one of the queues and place it in the other,but stopping just before the last element.Then,return the single element left in the original queue.Exercise10.2-1To insert an element in constant time,just add it to the head by making it point to the old head and have it be the head.To delete an element,it needs linear time because there is no way to get a pointer to the previous element in the list without starting at the head and scanning along.Exercise10.2-2The PUSH(L,x)operation is exactly the same as LIST-INSERT(L,x).The POP operation sets x equal to L.head,calls LIST-DELETE(L,L.head),then returns x.Exercise10.2-3In addition to the head,also keep a pointer to the last element in the linked list.To enqueue,insert the element after the last element of the list,and set it to be the new last element.To dequeue,delete thefirst element of the list and return it.Exercise10.2-4First let L.nil.key=k.Then run LIST-SEARCH’as usual,but remove the check that x=L.nil.Exercise10.2-5To insert,just do list insert before the current head,in constant time.To search,start at the head,check if the element is the current node being in-spected,check the next element,and so on until at the end of the list or you4found the element.This can take linear time in the worst case.To delete,again linear time is used because there is no way to get to the element immediately before the current element without starting at the head and going along the list.Exercise10.2-6Let L1be a doubly linked list containing the elements of S1and L2be a doubly linked list containing the elements of S2.We implement UNION as fol-lows:Set L1.nil.prev.next=L2.nil.next and L2.nil.next.prev=L1.nil.prev so that the last element of L1is followed by thefirst element of L2.Then set L1.nil.prev=L2.nil.prev and L2.nil.prev.next=L1.nil,so that L1.nil is the sentinel for the doubly linked list containing all the elements of L1and L2. Exercise10.2-7Algorithm9REVERSE(L)a=L.head.nextb=L.headwhile a=NIL dotmp=a.nexta.next=bb=aa=tmpend whileL.head=bExercise10.2-8We will store the pointer value for L.head separately,for convenience.In general,A XOR(A XOR C)=C,so once we know one pointer’s true value we can recover all the others(namely L.head)by applying this rule.Assuming there are at least two elements in the list,thefirst element will contain exactly the address of the second.Algorithm10LISTnp-SEARCH(L,k)p=NILx=L.headwhile x=NIL and x.key=k dotemp=xx=pXORx.npp=tempend whileTo reverse the list,we simply need to make the head be the“last”ele-5Algorithm11LISTnp-INSERT(L,x)x.np=L.headL.nil.np=xXOR(L.nil.npXORL.head)L.head=xAlgorithm12LISTnp-Delete(L,x)L.nil.np=L.nil.npXORL.headXORL.head.npL.head.np.np=L.head.np.npXORL.headment before L.nil instead of thefirst one after this.This is done by settingL.head=L.nil.npXORL.head.Exercise10.3-1A multiple array version could be L=2,/34567/124819511/23456A single array version could be L=4,127/410481371916105191311/16 Exercise10.3-2Algorithm13Allocate-Object()if free==NIL thenerror“out of space”elsex=freefree=A[x+1]end ifExercise10.3-3Allocate object just returns the index of some cells that it’s guaranteed tonot give out again until they’ve been freed.The prev attribute is not modified because only the next attribute is used by the memory manager,it’s up to the code that calls allocate to use the prev and key attributes as it seesfit.Exercise10.3-4For ALLOCATE-OBJECT,we will keep track of the next available spot inthe array,and it will always be one greater than the number of elements being stored.For FREE-OBJECT(x),when a space is freed,we will decrement the6Algorithm14Free-Object(x)A[x+1]=freefree=xposition of each element in a position greater than that of x by1and update pointers accordingly.This takes linear time.Exercise10.3-5See the algorithm COMP ACT IF Y−LIST(L,F)Exercise10.4-1181274510221Note that indices8and2in the array do not appear,and,in fact do not represent a valid tree.Exercise10.4-2See the algorithm PRINT-TREE.Exercise10.4-3Exercise10.4-4See the algorithm PRINT-TREE.Exercise10.4-5See the algorithm INORDER-PRINT’(T)Exercise10.4-6Our two pointers will be left and right.For a node x,x.left will point to the leftmost child of x and x.right will point to the sibling of x immediately to its right,if it has one,and the parent of x otherwise.Our boolean value b,stored at x,will be such that b=depth(x)mod2.To reach the parent of a node, simply keep following the“right”pointers until the parity of the boolean value changes.Tofind all the children of a node,start byfinding x.left,then follow7Algorithm15COMPACTIFY-LIST(L,F)if n=m thenreturnend ife=max{max i∈[m]{|key[i]|},max i∈L{|key[i]|}}increase every element of key[1..m]by2efor every element of L,if its key is greater than e,reduce it by2e f=1while key[f]<e dof++end whilea=L.headif a>m thennext[prev[f]]=next[f]prev[next[f]]=prev[f]next[f]=next[a]key[f]=key[a]prev[f]=prev[a]F REE−OBJECT(a)f++while key[f]<e dof++end whileend ifwhile a=L.head doif a>m thennext[prev[f]]=next[f]prev[next[f]]=prev[f]next[f]=next[a]key[f]=key[a]prev[f]=prev[a]F REE−OBJECT(a)f++while key[f]<e dof++end whileend ifend while8Algorithm16PRINT-TREE(T.root) if T.root==NIL thenreturnelsePrint T.root.keyPRINT-TREE(T.root.left)PRINT-TREE(T.root.right)end ifAlgorithm17INORDER-PRINT(T) let S be an empty stackpush(S,T)while S is not empty doU=pop(S)if U=NIL thenprint U.keypush(S,U.left)push(S,U.right)end ifend whileAlgorithm18PRINT-TREE(T.root) if T.root==NIL thenreturnelsePrint T.root.keyx=T.root.left−childwhile x=NIL doPRINT-TREE(x)x=x.right−siblingend whileend if9Algorithm19INORDER-PRINT’(T) a=T.leftprev=Twhile a=T doif prev=a.left thenprint a.keyprev=aa=a.rightelse if prev=a.right thenprev=aa=a.pelse if prev=a.p thenprev=aa=a.leftend ifend whileprint T.keya=T.rightwhile a=T doif prev=a.left thenprint a.keyprev=aa=a.rightelse if prev=a.right thenprev=aa=a.pelse if prev=a.p thenprev=aa=a.leftend ifend while10the“right”pointers until the parity of the boolean value changes,ignoring thislast node since it will be x.Problem10-1For each,we assume sorted means sorted in ascending orderunsorted,single sorted,single unsorted,double sorted,double SEARCH(L,k)n n n nINSERT(L,x)1111DELET E(L,x)n n11SUCCESSOR(L,x)n1n1P REDECESSOR(L,x)n n n1 MINIMUM(L,x)n1n1MAXIMUM(L,x)n n n1 Problem10-2In all three cases,MAKE-HEAP simply creates a new list L,sets L.head=NIL,and returns L in constant time.Assume lists are doubly linked.To realizea linked list as a heap,we imagine the usual array implementation of a binaryheap,where the children of the i th element are2i and2i+1.a.To insert,we perform a linear scan to see where to insert an element suchthat the list remains sorted.This takes linear time.Thefirst element in thelist is the minimum element,and we canfind it in constant time.Extract-minreturns thefirst element of the list,then deletes it.Union performs a mergeoperation between the two sorted lists,interleaving their entries such thatthe resulting list is sorted.This takes time linear in the sum of the lengthsof the two lists.b.To insert an element x into the heap,begin linearly scanning the list untilthefirst instance of an element y which is strictly larger than x.If no suchlarger element exists,simply insert x at the end of the list.If y does exist,replace y t by x.This maintains the min-heap property because x≤y andy was smaller than each of its children,so x must be as well.Moreover,xis larger than its parent because y was thefirst element in the list to exceedx.Now insert y,starting the scan at the node following x.Since we checkeach node at most once,the time is linear in the size of the list.To get theminimum element,return the key of the head of the list in constant time.To extract the minimum element,wefirst call MINIMUM.Next,we’ll replacethe key of the head of the list by the key of the second smallest element yin the list.We’ll take the key stored at the end of the list and use it toreplace the key of y.Finally,we’ll delete the last element of the list,and callMIN-HEAPIFY on the list.To implement this with linked lists,we need tostep through the list to get from element i to element2i.We omit this detailfrom the code,but we’ll consider it for runtime analysis.Since the value ofi on which MIN-HEAPIFY is called is always increasing and we never need11to step through elements multiple times,the runtime is linear in the length of the list.Algorithm20EXTRACT-MIN(L)min=MINIMUM(L)Linearly scan for the second smallest element,located in position i.L.head.key=L[i]L[i].key=L[L.length].keyDELETE(L,L[L.length])MIN-HEAPIFY(L[i],i)return minAlgorithm21MIN-HEAPIFY(L[i],i)1:l=L[2i].key2:r=L[2i+1].key3:p=L[i].key4:smallest=i5:if L[2i]=NIL and l<p then6:smallest=2i7:end if8:if L[2i+1]=NIL and r<L[smallest]then9:smallest=2i+110:end if11:if smallest=i then12:exchange L[i]with L[smallest]13:MIN-HEAPIFY(L[smallest],smallest)14:end ifUnion is implemented below,where we assume A and B are the two list representations of heaps to be merged.The runtime is again linear in the lengths of the lists to be merged.c.Since the algorithms in part b didn’t depend on the elements being distinct,we can use the same ones.Problem10-3a.If the original version of the algorithm takes only t iterations,then,we havethat it was only at most t random skips though the list to get to the desired value,since each iteration of the original while loop is a possible random jump followed by a normal step through the linked list.b.The for loop on lines2-7will get run exactly t times,each of which is constantruntime.After that,the while loop on lines8-9will be run exactly X t times.So,the total runtime is O(t+E[X t]).12Algorithm22UNION(A,B)1:if A.head=NIL then2:return B3:end if4:i=15:x=A.head6:while B.head=NIL do7:if B.head.key≤x.key then8:Insert a node at the end of list B with key x.key 9:x.key=B.head.key10:Delete(B,B.head)11:end if x=x.next12:end while13:return Aing equation C.25,we have that E[X t]= ∞i=1P r(X t≥i).So,we needto show that P r(X t≥i)≤(1−i/n)t.This can be seen because having X t being greater than i means that each random choice will result in an element that is either at least i steps before the desired element,or is after the desired element.There are n−i such elements,out of the total n elements that we were pricking from.So,for a single one of the choices to be from such a range, we have a probability of(n−i)/n=(1−i/n).Since each of the selections was independent,the total probability that all of them were is(1−i/n)t, as stly,we can note that since the linked list has length n,the probability that X t is greater than n is equal to zero.d.Since we have that t>0,we know that the function f(x)=x t is increasing,so,that means that x t≤f(x).So,n−1r=0r t=nr t dr≤nf(r)dr=n t+1e.E[X t]≤nr=1(1−r/n)t=nr=1ti=0ti(−r/n)i=ti=0nr=1ti(−r/n)i=ti=0ti(−1)in i−1+n−1r=0(r)t/n≤ti=0ti(−1)in i−1+n i+1/n ≤ti=0ti(−1)in ii+1=1t+1ti=0t+1i+1(−n)i≤(1−n)t+1t+1f.We just put together parts b and e to get that it runs in time O(t+n/(t+1)).But,this is the same as O(t+n/t).13g.Since we have that for any number of iterations t that the first algorithm takes to find its answer,the second algorithm will return it in time O (t +n/t ).In particular,if we just have that t =√n .The second algorithm takestime only O (√n ).This means that tihe first list search algorithm is O (√n )as well.h.If we don’t have distinct key values,then,we may randomly select an element that is further along than we had been before,but not jump to it because it has the same key as what we were currently at.The analysis will break when we try to bound the probability that X t ≥i .14。
算法导论 第三版 第十六章 答案 英
Chapter16Michelle Bodnar,Andrew LohrApril12,2016Exercise16.1-1The given algorithm would just stupidly compute the minimum of the O(n) numbers or return zero depending on the size of S ij.There are a possible number of subproblems that is O(n2)since we are selecting i and j so that1≤i≤j≤n.So,the runtime would be O(n3).Exercise16.1-2This becomes exactly the same as the original problem if we imagine time running in reverse,so it produces an optimal solution for essentially the same reasons.It is greedy because we make the best looking choice at each step.Exercise16.1-3As a counterexample to the optimality of greedily selecting the shortest, suppose our activity times are{(1,9),(8,11),(10,20)}then,picking the shortestfirst,we have to eliminate the other two,where if we picked the other two instead,we would have two tasks not one.As a counterexample to the optimality of greedily selecting the task that conflicts with the fewest remaining activities,suppose the activity times are {(−1,1),(2,5),(0,3),(0,3),(0,3),(4,7),(6,9),(8,11),(8,11),(8,11),(10,12)}.Then, by this greedy strategy,we wouldfirst pick(4,7)since it only has a two con-flicts.However,doing so would mean that we would not be able to pick the only optimal solution of(−1,1),(2,5),(6,9),(10,12).As a counterexample to the optimality of greedily selecting the earliest start times,suppose our activity times are{(1,10),(2,3),(4,5)}.If we pick the ear-liest start time,we will only have a single activity,(1,10),whereas the optimal solution would be to pick the two other activities.Exercise16.1-4Maintain a set of free(but already used)lecture halls F and currently busy lecture halls B.Sort the classes by start time.For each new start time which you encounter,remove a lecture hall from F,schedule the class in that room,1and add the lecture hall to B.If F is empty,add a new,unused lecture hall to F.When a classfinishes,remove its lecture hall from B and add it to F. Why this is optimal:Suppose we have just started using the m th lecture hall for thefirst time.This only happens when ever classroom ever used before is in B.But this means that there are m classes occurring simultaneously,so it is necessary to have m distinct lecture halls in use.Exercise16.1-5Run a dynamic programming solution based offof the equation(16.2)where the second case has“1”replaced with“v k”.Since the subproblems are still indexed by a pair of activities,and each calculation requires taking the minimum over some set of size≤|S ij|∈O(n).The total runtime is bounded by O(n3). Exercise16.2-1A optimal solution to the fractional knapsack is one that has the highest total value density.Since we are always adding as much of the highest value density we can,we are going to end up with the highest total value density. Suppose that we had some other solution that used some amount of the lower value density object,we could substitute in some of the higher value density object meaning our original solution coud not of been optimal.Exercise16.2-2Suppose we know that a particular item of weight w is in the solution.Then we must solve the subproblem on n−1items with maximum weight W−w. Thus,to take a bottom-up approach we must solve the0-1knapsack problem for all items and possible weights smaller than W.We’ll build an n+1by W+1table of values where the rows are indexed by item and the columns are indexed by total weight.(Thefirst row and column of the table will be a dummy row).For row i column j,we decide whether or not it would be advantageous to include item i in the knapsack by comparing the total value of of a knapsack including items1through i−1with max weight j,and the total value of including items1through i−1with max weight j−i.weight and also item i.To solve the problem,we simply examine the n,W entry of the table to determine the maximum value we can achieve.To read offthe items we include, start with entry n,W.In general,proceed as follows:if entry i,j equals entry i−1,j,don’t include item i,and examine entry i−1,j next.If entry i,j doesn’t equal entry i−1,j,include item i and examine entry i−1,j−i.weight next. See algorithm below for construction of table:Exercise16.2-3At each step just pick the lightest(and most valuable)item that you can pick.To see this solution is optimal,suppose that there were some item j that we included but some smaller,more valuable item i that we didn’t.Then,we could replace the item j in our knapsack with the item i.it will definitelyfit2Algorithm10-1Knapsack(n,W)1:Initialize an n+1by W+1table K2:for j=1to W do3:K[0,j]=04:end for5:for i=1to n do6:K[i,0]=07:end for8:for i=1to n do9:for j=1to W do10:if j<i.weight then11:K[i,j]=K[i−1,j]12:end if13:K[i,j]=max(K[i−1,j],K[i−1,j−i.weight]+i.value)14:end for15:end forbecause i is lighter,and it will also increase the total value because i is more valuable.Exercise16.2-4The greedy solution solves this problem optimally,where we maximize dis-tance we can cover from a particular point such that there still exists a place to get water before we run out.Thefirst stop is at the furthest point from the starting position which is less than or equal to m miles away.The problem exhibits optimal substructure,since once we have chosen afirst stopping point p,we solve the subproblem assuming we are starting at bining these two plans yields an optimal solution for the usual cut-and-paste reasons.Now we must show that this greedy approach in fact yields afirst stopping point which is contained in some optimal solution.Let O be any optimal solution which has the professor stop at positions o1,o2,...,o k.Let g1denote the furthest stopping point we can reach from the starting point.Then we may replace o1by g2to create a modified solution G,since o2−o1<o2−g1.In other words,we can actually make it to the positions in G without running out of water.Since G has the same number of stops,we conclude that g1is contained in some optimal solution.Therefore the greedy strategy works.Exercise16.2-5Consider the leftmost interval.It will do no good if it extends any further left than the leftmost point,however,we know that it must contain the leftmost point.So,we know that it’s left hand side is exactly the leftmost point.So,we just remove any point that is within a unit distance of the left most point since3they are contained in this single interval.Then,we just repeat until all points are covered.Since at each step there is a clearly optimal choice for where to put the leftmost interval,thisfinal solution is optimal.Exercise16.2-6First compute the value of each item,defined to be it’s worth divided by its weight.We use a recursive approach as follows:Find the item of median value, which can be done in linear time as shown in chapter9.Then sum the weights of all items whose value exceeds the median and call it M.If M exceeds W then we know that the solution to the fractional knapsack problem lies in taking items from among this collection.In other words,we’re now solving the frac-tional knapsack problem on input of size n/2.On the other hand,if the weight doesn’t exceed W,then we must solve the fractional knapsack problem on the input of n/2low-value items,with maximum weight W−M.Let T(n)denote the runtime of the algorithm.Since we can solve the problem when there is only one item in constant time,the recursion for the runtime is T(n)=T(n/2)+cn and T(1)=d,which gives runtime of O(n).Exercise16.2-7Since an identical permutation of both sets doesn’t affect this product,sup-pose that A is sorted in ascending order.Then,we will prove that the product is maximized when B is also sorted in ascending order.To see this,suppose not,that is,there is some i<j so that a i<a j and b i>b j.Then,consideronly the contribution to the product from the indices i and j.That is,a b ii a b j j,then,if we were to swap the order of b1and b j,we would have that contributionbe a b ji a b ij.we can see that this is larger than the previous expression becauseit differs by a factor of(a ja i )b i−b j which is bigger than one.So,we couldn’t ofmaximized the product with this ordering on B.Exercise16.3-1If we have that x.freq=b.freq,then we know that b is tied for lowest frequency.In particular,it means that there are at least two things with lowest frequency,so y.freq=x.freq.Also,since x.freq≤a.freq≤b.freq=x.freq, we must have a.freq=x.freq.Exercise16.3-2Let T be a binary tree corresponding to an optimal prefix code and suppose that T is not full.Let node n have a single child x.Let T be the tree obtained by removing n and replacing it by x.Let m be a leaf node which is a descendant of x.Then we have4cost(T )≤c∈C\{m}c.freq·d T(c)+m.freq(d T(m)−1)<c∈Cc.freq·d T(c)=cost(T)which contradicts the fact that T was optimal.Therefore every binary tree corresponding to an optimal prefix code is full.Exercise16.3-3An optimal huffman code would be00000001→a0000001→b000001→c00001→d0001→e001→f01→g1→hThis generalizes to having thefirst n Fibonacci numbers as the frequencies in that the n th most frequent letter has codeword0n−11.To see this holds,we will prove the recurrencen−1i=0F(i)=F(n+1)−1This will show that we should join together the letter with frequency F(n)with the result of joining together the letters with smaller frequencies.We will prove it by induction.For n=1is is trivial to check.Now,suppose that we have n−1≥1,then,F(n+1)−1=F(n)+F(n−1)−1=F(n−1)+n−2i=0F(i)=n−1i=0F(i)See also Lemma19.2.Exercise16.3-4Let x be a leaf node.Then x.freq is added to the cost of each internal node which is an ancestor of x exactly once,so its total contribution to the new way of computing cost is x.freq·d T(x),which is the same as its old contribution. Therefore the two ways of computing cost are equivalent.5Exercise16.3-5We construct this codeword with monotonically increasing lengths by always resolving ties in terms of which two nodes to join together by joining together those with the two latest occurring earliest elements.We will show that the ending codeword has that the least frequent words are all having longer code-words.Suppose to a contradiction that there were two words,w1and w2so that w1appears more frequently,but has a longer codeword.This means that it was involved in more merge operation than w2was.However,since we are always merging together the two sets of words with the lowest combined frequency,this would contradict the fact that w1has a higher frequency than w2.Exercise16.3-6First observe that any full binary tree has exactly2n−1nodes.We can encode the structure of our full binary tree by performing a preorder traversal of T.For each node that we record in the traversal,write a0if it is an internal node and a1if it is a leaf node.Since we know the tree to be full,this uniquely determines its structure.Next,note that we can encode any character of C in lg n bits.Since there are n characters,we can encode them in order of appearance in our preorder traversal using n lg n bits.Exercise16.3-7Instead of grouping together the two with lowest frequency into pairs that have the smallest total frequency,we will group together the three with lowest frequency in order to have afinal result that is a ternary tree.The analysis of optimality is almost identical to the binary case.We are placing the symbols of lowest frequency lower down in thefinal tree and so they will have longer codewords than the more frequently occurring symbolsExercise16.3-8For any2characters,the sum of their frequencies exceeds the frequency of any other character,so initially Huffman coding makes128small trees with2 leaves each.At the next stage,no internal node has a label which is more than twice that of any other,so we are in the same setup as before.Continuing in this fashion,Huffman coding builds a complete binary tree of height lg(256)=8, which is no more efficient than ordinary8-bit length codes.Exercise16.3-9If every possible character is equally likely,then,when constructing the Huff-man code,we will end up with a complete binary tree of depth7.This means that every character,regardless of what it is will be represented using7bits. This is exactly as many bits as was originally used to represent those characters, so the total length of thefile will not decrease at all.6Exercise16.4-1Thefirst condition that S is afinite set is a given.To prove the second condition we assume that k≥0,this gets us that I k is nonempty.Also,to prove the hereditary property,suppose A∈I k this means that|A|≤k.Then, if B⊆A,this means that|B|≤|A|≤k,so B∈I stly,we prove the exchange property by letting A,B∈I k be such that|A|<|B|.Then,we can pick any element x∈B\A,then,|A∪{x}|=|A|+1≤|B|≤k,so,we can extend A to A∪{x}∈I k.Exercise16.4-2Let c1,...,c m be the columns of T.Suppose C={c i1,...,c ik}is depen-dent.Then there exist scalars d1,...,d k not all zero such that kj=1d j c ij=0.By adding columns to C and assigning them to have coefficient0in the sum, we see that any superset of C is also dependent.By contrapositive,any subset of an independent set must be independent.Now suppose that A and B are two independent sets of columns with|A|>|B|.If we couldn’t add any col-umn of A to be whilst preserving independence then it must be the case that every element of A is a linear combination of elements of B.But this implies that B spans a|A|-dimensional space,which is impossible.Therefore our in-dependence system must satisfy the exchange property,so it is in fact a matroid.Exercise16.4-3Condition one of being a matroid is still satisfied because the base set hasn’t changed.Next we show that I is nonempty.Let A be any maximal element of I then,we have that S−A∈I because S−(S−A)=A⊆A which is maximal in I.Next we show the hereditary property,suppose that B⊆A∈I ,then, there exists some A ∈I so that S−A⊆A ,however,S−B⊇S−A⊆A so B∈I .Lastly we prove the exchange property.That is,if we have B,A∈I and |B|<|A|we canfind an element x in A−B to add to B so that it stays independent.We will split into two cases.Ourfirst case is that|A|=|B|+1.We clearly need to select x to be the single element in A−B.Since S−B contains a maximal independent set Our second case is if thefirst case does not hold.Let C be a maximal inde-pendent set of I contained in S−A.Pick an aribitrary set of size|C|−1from some maximal independent set contained in S−B,call it D.Since D is a subset of a maximal independent set,it is also independent,and so,by the exchange property,there is some y∈C−D so that D∪{y}is a maximal independent set in I.Then,we select x to be any element other than y in A−B.Then, S−(B∪{x})will still contain D∪{y}.This means that B∪{x}is independent in(I)7Exercise16.4-4Suppose X⊂Y and Y∈I.Then(X∩S i)⊂(Y∩S i)for all i,so |X∩S i|≤|Y∩S i|≤1for all1≤i≤k.Therefore M is closed under inclusion.Now Let A,B∈I with|A|=|B|+1.Then there must exist some j such that|A∩S j|=1but B∩S j|=0.Let a=A∩S j.Then a/∈B and |(B∪{a})∩S j|=1.Since|(B∪{a})∩S i|=|B∩S i|for all i=j,we must have B∪{a}∈I.Therefore M is a matroid.Exercise16.4-5Suppose that W is the largest weight that any one element takes.Then, define the new weight function w2(x)=1+W−w(x).This then assigns a strictly positive weight,and we will show that any independent set that that has maximum weight with respect to w2will have minimum weight with respect to w.Recall Theorem16.6since we will be using it,suppose that for our matriod,all maximal independent sets have size S.Then,suppose M1and M2 are maximal independent sets so that M1is maximal with respect to w2and M2is minimal with respect to w.Then,we need to show that w(M1)=w(M2). Suppose not to achieve a contradiction,then,by minimality of M2,w(M1)> w(M2).Rewriting both sides in terms of w2,we have w2(M2)−(1+W)S> w2(M1)−(1+W)S,so,w2(M2)>w2(M1).This however contradicts maximality of M1with respect to w2.So,we must have that w(M1)=w(M2).So,a maximal independent set that has the largest weight with respect to w2also has the smallest weight with respect to w.Exercise16.5-1With the requested substitution,the instance of the problem becomesa i1234567d i4243146w i10203040506070We begin by just greedily constructing the matroid,adding the most costly to leave incomplete tasksfirst.So,we add tasks7,6,5,4,3.Then,in order to schedule tasks1or2we need to leave incomplete more important tasks.So, ourfinal schedule is 5,3,4,6,7,1,2 to have a total penalty of only w1+w2=30.Exercise16.5-2Create an array B of length n containing zeros in each entry.For each ele-ment a∈A,add1to B[a.deadline].If B[a.deadline]>a.deadline,return that the set is not independent.Otherwise,continue.If successfully examine every element of A,return that the set is independent.8Problem16-1a.Always give the highest denomination coin that you can without going over.Then,repeat this process until the amount of remaining change drops to0.b.Given an optimal solution(x0,x1,...,x k)where x i indicates the number ofcoins of denomination c i.We willfirst show that we must have x i<c for every i<k.Suppose that we had some x i≥c,then,we could decrease x i by c and increase x i+1by1.This collection of coins has the same value and has c−1fewer coins,so the original solution must of been non-optimal.This configuration of coins is exactly the same as you would get if you kept greedily picking the largest coin possible.This is because to get a total value of V,you would pick x k= V c−k and for i<k,x i (V modc i+1)c−i .This is the only solution that satisfies the property that there aren’t more than c of any but the largest denomination because the coin amounts are a base c representation of V modc k.c.Let the coin denominations be{1,3,4},and the value to make change for be6.The greedy solution would result in the collection of coins{1,1,4}butthe optimal solution would be{3,3}.d.See algorithm MAKE-CHANGE(S,v)which does a dynamic programmingsolution.Since thefirst forloop runs n times,and the inner for loop runs k times,and the later while loop runs at most n times,the total running time is O(nk).Problem16-2a.Order the tasks by processing time from smallest to largest and run them inthat order.To see that this greedy solution is optimal,first observe that the problem exhibits optimal substructure:if we run thefirst task in an optimal solution,then we obtain an optimal solution by running the remaining tasks in a way which minimizes the average completion time.Let O be an optimal solution.Let a be the task which has the smallest processing time and let b be thefirst task run in O.Let G be the solution obtained by switching the order in which we run a and b in O.This amounts reducing the completion times of a and the completion times of all tasks in G between a and b by the difference in processing times of a and b.Since all other completion times remain the same,the average completion time of G is less than or equal to the average completion time of O,proving that the greedy solution gives an optimal solution.This has runtime O(n lg n)because we mustfirst sort the elements.b.Without loss of generality we my assume that every task is a unit time task.Apply the same strategy as in part(a),except this time if a task which we9Algorithm2MAKE-CHANGE(S,v)Let numcoins and coin be empty arrays of length v,and any any attempt to access them at indices in the range−max(S),−1should return∞for i from1to v dobestcoin=nilbestnum=∞for c in S doif numcoins[i−c]+1<bestnum thenbestnum=numcoins[i-c]bestcoin=cend ifend fornumcoins[i]=bestnumcoin[i]=bestcoinend forlet change be an empty setiter=vwhile iter>0doadd coin[iter]to changeiter=iter−coin[iter]end whilereturn changewould like to add next to the schedule isn’t allowed to run yet,we must skip over it.Since there could be many tasks of short processing time which have late release time,the runtime becomes O(n2)since we might have to spend O(n)time deciding which task to add next at each step.Problem16-3a.First,suppose that a set of columns is not linearly independent over F2then,there is some subset of those columns,say S so that a linear combination of S is0.However,over F2,since the only two elements are1and0,a linear combination is a sum over some subset.Suppose that this subset is S ,note that it has to be nonempty because of linear dependence.Now,consider the set of edges that these columns correspond to.Since the columns had their total incidence with each vertex0in F2,it is even.So,if we consider the subgraph on these edges,then every vertex has a even degree.Also,since our S was nonempty,some component has an edge.Restrict our attention to any such component.Since this component is connected and has all even vertex degrees,it contains an Euler Circuit,which is a cycle.Now,suppose that our graph had some subset of edges which was a cycle.Then,the degree of any vertex with respect to this set of edges is even,so,10when we add the corresponding columns,we will get a zero column in F2.Since sets of linear independent columns form a matroid,by problem16.4-2, the acyclic sets of edges form a matroid as well.b.One simple approach is to take the highest weight edge that doesn’t completea cycle.Another way to phrase this is by running Kruskal’s algorithm(seeChapter23)on the graph with negated edge weights.c.Consider the digraph on[3]with the edges(1,2),(2,1),(2,3),(3,2),(3,1)where(u,v)indicates there is an edge from u to v.Then,consider the two acyclic subsets of edges B=(3,1),(3,2),(2,1)and A=(1,2),(2,3).Then, adding any edge in B−A to A will create a cycle.So,the exchange property is violated.d.Suppose that the graph contained a directed cycle consisting of edges corre-sponding to columns S.Then,since each vertex that is involved in this cycle has exactly as many edges going out of it as going into it,the rows corre-sponding to each vertex will add up to zero,since the outgoing edges count negative and the incoming vertices count positive.This means that the sum of the columns in S is zero,so,the columns were not linearly independent.e.There is not a perfect correspondence because we didn’t show that not con-taining a directed cycle means that the columns are linearly independent, so there is not perfect correspondence between these sets of independent columns(which we know to be a matriod)and the acyclic sets of edges (which we know not to be a matroid).Problem16-4a.Let O be an optimal solution.If a j is scheduled before its deadline,we canalways swap it with whichever activity is scheduled at its deadline without changing the penalty.If it is scheduled after its deadline but a j.deadline≤j then there must exist a task from among thefirst j with penalty less than that of a j.We can then swap a j with this task to reduce the overall penalty incurred.Since O is optimal,this can’t happen.Finally,if a j is scheduled after its deadline and a j.deadline>j we can swap a j with any other late task without increasing the penalty incurred.Since the problem exhibits the greedy choice property as well,this greedy strategy always yields on optimal solution.b.Assume that MAKE-SET(x)returns a pointer to the element x which isnow it its own set.Our disjoint sets will be collections of elements which have been scheduled at contiguous times.We’ll use this structure to quickly find the next available time to schedule a task.Store attributes x.low and x.high at the representative x of each disjoint set.This will give the earliest and latest time of a scheduled task in the block.Assume that UNION(x,y)11maintains this attribute.This can be done in constant time,so it won’t af-fect the asymptotics.Note that the attribute is well-defined under the union operation because we only union two blocks if they are contiguous.Without loss of generality we may assume that task a1has the greatest penalty,task a2has the second greatest penalty,and so on,and they are given to us in the form of an array A where A[i]=a i.We will maintain an array D such that D[i]contains a pointer to the task with deadline i.We may assume that the size of D is at most n,since a task with deadline later than n can’t possibly be scheduled on time.There are at most3n total MAKE-SET,UNION,and FIND-SET operations,each of which occur at most n times,so by Theorem21.14the runtime is O(nα(n)).Algorithm3SCHEDULING-VARIATIONS(A)1:Initialize an array D of size n.2:for i=1to n do3:a i.time=a i.deadline4:if D[a i.deadline]=NIL then5:y=FIND-SET(D[a i.deadline])6:a i.time=y.low−17:end if8:x=MAKE-SET(a i)9:D[a i.time]=x10:x.low=x.high=a i.time11:if D[a i.time−1]=NIL then12:UNION(D[a i.time−1],D[a i.time])13:end if14:if D[a i.time+1]=NIL then15:UNION(D[a i.time],D[a i.time+1])16:end if17:end forProblem16-5a.Suppose there are m distinct elements that could be requested.There may besome room for improvement in terms of keeping track of the furthest in future element at each position.If you maintain a(double circular)linked list witha node for each possible cache element and an array so that in index i thereis a pointer corresponding to the node in the linked list corresponding to the possible cache request i.Then,starting with the elements in an arbitrary order,process the sequence r1,...,r n from right to left.Upon processing a request move the node corresponding to that request to the beginning of the linked list and make a note in some other array of length n of the element at the end of the linked list.This element is tied for furthest-in-future.Then, just scan left to right through the sequence,each time just checking some12set for which elements are currently in the cache.It can be done in constant time to check if an element is in the cache or not by a direct address table. If an element need be evicted,evict the furthest-in-future one noted earlier. This algorithm will take time O(n+m)and use additional space O(m+n). If we were in the stupid case that m>n,we could restrict our attention to the possible cache requests that actually happen,so we have a solution that is O(n)both in time and in additional space required.b.Index the subproblems c[i,S]by a number i∈[n]and a subset S∈ [m]k.Which indicates the lowest number of misses that can be achieved with an initial cache of S starting after index i.Then,c[i,S]=minx∈{S}(c[i+1,{r i}∪(S−{x})]+(1−χ{ri}(x)))which means that x is the element that is removed from the cache unless it is the current element being accessed,in which case there is no cost of eviction.c.At each time we need to add something new,we can pick which entry toevict from the cache.We need to show the there is an exchange property.That is,if we are at round i and need to evict someone,suppose we evict x.Then,if we were to instead evict the furthest in future element y,we would have no more evictions than before.To see this,since we evicted x,we will have to evict someone else once we get to x,whereas,if we had used the other strategy,we wouldn’t of had to evict anyone until we got to y.This is a point later in time than when we had to evict someone to put x back into the cache,so we could,at reloading y,just evict the person we would of evicted when we evicted someone to reload x.This causes the same number of misses unless there was an access to that element that wold of been evicted at reloading x some point in between when x any y were needed,in which case furthest in future would be better.13。
算法导论 第三版 第十七章 答案 英
Chapter17Michelle Bodnar,Andrew LohrApril12,2016Exercise17.1-1It woudn’t because we could make an arbitrary sequence of MULT IP USH(k),MULT IP OP(k). The cost of each will beΘ(k),so the average runtime of each will beΘ(k)notO(1).Exercise17.1-2Suppose the input is a1followed by k−1zeros.If we call DECREMENTwe must change k entries.If we then call INCREMENT on this it reverses thesek changes.Thus,by calling them alternately n times,the total time isΘ(nk).Exercise17.1-3Note that this setup is similar to the dynamic tables discussed in section17.4.Let n be arbitrary,and have the cost of operation i be c(i).Then,ni=1c(i)=lg(n)i=12i+i≤n not a power of21≤lg(n)i=12i+n=21+ lg(n) −1+n≤4n−1+n≤5n∈O(n)So,since tofind the average,we divide by n,the average runtime of each com-mand is O(1).Exercise17.2-1To every stack operation,we charge twice.First we charge the actual cost of the stack operation.Second we charge the cost of copying an element later on.Since we have the size of the stack never exceed k,and there are always k operations between backups,we always overpay by at least enough.So,the ammortized cost of the operation is constant.So,the cost of the n operation is O(n).Exercise17.2-21Assign the cost 3to each operation.The first operation costs 1,so we have a credit of21.Now suppose that we have nonnegative credit after having per-formed the 2i th operation.Each of the 2i −1operations following has cost 1.Since we pay 3for each,we build up a credit of 2from each of them,giving us 2(2i −1)=2i +1−2credit.Then for the 2i +1th operation,the 3credits we pay gives us a total of 2i +1+1to use towards the actual cost of 2i +1,leaving us with 1credit.Thus,for any operation we have nonnegative credit.Since the amortized cost of each operation is O (1),an upper bound on the total actual cost of n operations is O (n ).Exercise 17.2-3For each time we set a bit to 1,we both pay a dollar for eventually setting it back to zero (in the usual manner as the counter is incremented).But we also pay a third dollar in the event that even after the position has been set back to zero,we check about zeroing it out during a reset operation.We also increment the position of the highest order bit (as needed).Then,while doing the reset operation,we will only need consider those positions less significant than the highest order bit.Because of this,we have at least paid one extra dollar before,because we had set the bit at that position to one at least once for the highest order bit to be where it is.Since we have only put down a constant ammortized cost at each setting of a bit to 1,the ammortized cost is constant because each increment operation involves setting only a single bit to 1.Also,the ammortized cost of a reset is zero because it involves setting no bits to one.It’s true cost has already been paid for.Exercise 17.3-1Define Φ (D )=Φ(D )−Φ(D 0).Then,we have that Φ(D )≥Φ(D 0)implies Φ (D )=Φ(D )−Φ(D 0)≥Φ(D 0)−Φ(D 0)=0.and Φ (D 0)=φ(D 0)−Φ(D 0)=stly,the ammortized cost using Φ is c i +Φ (D i )−Φ (D i −1)=c i +(Φ(D i )−Φ(D 0))−(Φ(D i )−Φ(D i −1))=c i +Φ(D i )−Φ(D i −1)which is the ammortized cost using Φ.Exercise 17.3-2Let Φ(D i )=k +3if i =2k .Otherwise,let k be the largest integer such that 2k ≤i .Then define Φ(D i )=Φ(D 2k )+2(i −2k ).Also,define Φ(D 0)=0.Then Φ(D i )≥0for all i .The potential difference Φ(D i )−Φ(D i −1)is 2if i is not a power of 2,and is −2k +3if i =2k .Thus,the total amortized cost of n operations is n i =1ˆc i = n i =13=3n =O (n ).Exercise 17.3-3Make the potential function be equal to n lg(n )where n is the size of the min-heap.Then,there is still a cost of O (lg(n ))to insert,since only an amount2of ammortization that is about lg(n)was spent to increase the size of the heap by1.However,since extract min decreases the size of the heap by1,the actual cost of the operation is offset by a change in potential of the same order,so only a constant amount of work is needed.Exercise17.3-4Since D n=s n,D0=s0,and the amortized cost of n stack operations start-ing from an empty stack is is O(n),equation17.3implies that the amortized cost is O(n)+s n−s0.Exercise17.3-5Suppose that we have that n≥cb.Since the counter begins with b1’s,we’ll make all of our ammortized cost2+1c .Then the additional cost of1coverthe course of n operations amounts to paying an extra nc ≥b which was howmuch we were behind by when we started.Since the ammortized cost of each operation is2+1cit is in O(1)so the total cost is in O(n).Exercise17.3-6We’ll use the accounting method for the analysis.Assign cost3to the ENQUEUE operation and0to the DEQUEUE operation.Recall the imple-mentation of10.1-6where we enqueue by pushing on to the top of stack1,and dequeue by popping from stack2.If stack2is empty,then we must pop every element from stack1and push it onto stack2before popping the top element from stack2.For each item that we enqueue we accumulate2credits.Before we can dequeue an element,it must be moved to stack2.Note:this might happen prior to the time at which we wish to dequeue it,but it will happen only once overall.One of the2credits will be used for this move.Once an item is on stack2its pop only costs1credit,which is exactly the remaining credit associated to the element.Since each operation’s cost is O(1),the amortized cost per operation is O(1).Exercise17.3-7We’ll store all our elements in an array,and if ever it is too large,we will copy all the elements out into an array of twice the length.To delete the larger half,wefirstfind the element m with order statistic |S|/2 by the algorithm presented in section9.3.Then,scan through the array and copy out the ele-ments that are smaller or equal to m into an array of half the size.Since the delete half operation takes time O(|S|)and reduces the number of elements by |S|/2 ∈Ω(|S|),we can make these operations take ammortized constant time by selecting our potential function to be linear in|S|.Since the insert opera-tion only increases|S|by one,we have that there is only a constant amount of work going towards satisfying the potential,so the total ammortized cost of an3insertion is still constant.To output all the elements just iterate through the array and output each.Exercise17.4-1By theorems11.6-11.8,the expected cost of performing insertions and searches in an open address hash table approaches infinity as the load factor approaches one,for any load factorfixed away from1,the expected time is bounded by a constant though.The expected value of the actual cost my not be O(1)for every insertion because the actual cost may include copying out the current val-ues from the current table into a larger table because it became too full.This would take time that is linear in the number of elements stored.Exercise17.4-2First suppose thatαi≥1/2.Then we haveˆc i=1+(2·num i−size i)−(2·num i−1−size i−1)=1+2·num i−size i−2·num i−2+size i=−2.On the other hand,ifαi<1/2then we haveˆc i=1+(size i/2−num i)−(2·num i−1−size i−1)=1+size i/2−num i−2·num i−2+size i=−1+32(size i−2·num i)≤−1+32(size i−(size i−1))≤1.Either way,the amortized cost is bounded above by a constant. Exercise17.4-3If a resizing is not triggered,we haveˆc i=C i+Φi−Φi−1=1+|2·num i−size i|−|2·num i−1−size i−1|=1+|2·num i−size i|−|2·num i+2−size i|≤1+|2·num i−size i|−|2·num i−size i|+2=3However,if a resizing is triggered,suppose thatαi−1<12.Then the actualcost is num i+1since we do a deletion and move all the rest of the items.Also,4since we resize when the load factor drops below 13,we have that size i −1/3=num i −1=num i +1.ˆc i =c i +φi −Φi −1=num i +1+|2·num i −size i |−|2·num i −1−size i −1|≤num i +1+ 23size i −1−2·num i −(size i −1−2·num i −2)=num i +1+(2·num i +2−2·num i )−(3·num i +3−2·num i )=2The last case,that we had the load factor was greater than or equal to 12,will not trigger a resizing because we only resize when the load drops below 13.Problem 17-1a.Initialize a second array of length n to all trues,then,going through the indices of the original array in any order,if the corresponding entry in the second array is true,then swap the element at the current index with the element at the bit-reversed position,and set the entry in the second array corresponding to the bit-reversed index equal to false.Since we are running rev k <n times,the total runtime is O (nk ).b.Doing a bit reversed increment is the same thing as adding a one to the leftmost position where all carries are going to the left instead of the right.See the algorithm BIT-REVERSED-INCREMENT(a)Algorithm 1BIT-REVERSED-INCREMENT(a)let m be a 1followed by k-1zeroeswhile m bitwise-AND a is not zero doa =a bitwise-XOR mshift m right by 1end whilereturn m bitwise-OR aBy a similar analysis to the binary counter (just look at the problem in a mirror),this BIT-REVERSED-INCREMENT will take constant ammortized time.So,to perform the bit-reversed permutation,have a normal binary counter and a bit reversed counter,then,swap the values of the two counters and increment.Do not swap however if those pairs of elements have already been swapped,which can be kept track of in a auxiliary array.c.The BIT-REVERSED-INCREMENT procedure given in the previous part only uses single shifts to the right,not arbitrary shifts.Problem 17-25a.We linearly go through the lists and binary search each one since we don’tknow the relationship between one list an another.In the worst case,every list is actually used.Since list i has length2i and it’s sorted,we can search it in O(i)time.Since i varies from0to O(lg n),the runtime of SEARCH is O((lg n)2).b.To insert,suppose we must change thefirst m1’s in a row to0’s,followedby changing a0to a1in the binary representation of n.Then we must com-bine lists A0,A1,...,A m−1into list A m,then insert the new item into listA m.Since merging two sorted lists can be done linearly in the total lengthof the lists,the time this takes is O(2m).In the worst case,this takes time O(n)since m could equal k.However,since there are a total of2m items the amortized cost per item is O(1).c.Find the smallest m such that n m=0in the binary representation of n.Ifthe item to be deleted is not in list A m,remove it from its list and swap in an item from A m,arbitrarily.This can be done in O(lg n)time since we may need to search list A k tofind the element to be deleted.Now simply break list A m into lists A0,A1,...,A m−1by index.Since the lists are already sorted,the runtime comes entirely from making the splits,which takes O(m) time.In the worst case,this is O(lg n).Problem17-3a.Since we have O(x.size)auxiliary space,we will take the tree rooted at x andwrite down an inorder traversal of the tree into the extra space.This will only take linear time to do because it will visit each node thrice,once when passing to its left child,once when the nodes value is output and passing to the right child,and once when passing to the parent.Then,once the inorder traversal is written down,we can convert it back to a binary tree by selecting the median of the list to be the root,and recursing on the two halves of the list that remain on both sides.Since we can index into the middle element ofa list in constant time,we will have the recurrence T(n)=2T(n/2)+1,whichhas solution that is linear.Since both trees come from the same underlying inorder traversal,the result is a BST since the original was.Also,since the root at each point was selected so that half the elements are larger and half the elements are smaller,it is a1/2-balanced tree.b.We will show by induction that any tree with≤α−d+d elements has adepth of at most d.This is clearly true for d=0because any tree witha single node has depth0,and sinceα0=1,we have that our restrictionon the number of elements requires there to only be one.Now,suppose that in some inductive step we had a contradiction,that is,some tree of6depth d that isαbalanced but has more thanα−d elements.We know that both of the subtrees are alpha balanced,and by being alpha balanced at the root,we have root.left.size≤α·root.size which implies root.right.size> root.size−α·root.size−1.So,root.right.size>(1−α)root.size−1> (1−α)α−d+d−1=(α−1−1)α−d+1+d−1≥α−d+1+d−1which is a contradiction to the fact that it held for all smaller values of d because any child of a tree of depth d has depth d−1.c.The potential function is a sum of∆(x)each of which is the absolute valueof a quantity,so,since it is a sum of nonnegative values,it is nonnegative regardless of the input BST.If we suppose that our tree is1/2−balanced,then,for every node x,we’ll have that∆(x)≤1,so,the sum we compute tofind the potential will be over no nonzero terms.d.Suppose that we have a tree that has become no longerαbalanced be-cause it’s left subtree has become too large.This means that x.left.size>αx.size=(α−12)x.size+12α.size.This means that we had at least c(α−1 2)x.size units of potential.So,we need to select c≥1α−12.e.Suppose that our tree isαbalanced.Then,we know that performing a searchtakes time O(lg(n)).So,we perform that search and insert the element that we need to insert or delete the element we found.Then,we may have made the tree become unbalanced.However,we know that since we only changed one position,we have only changed the∆value for all of the parents of the node that we either inserted or deleted.Therefore,we can rebuild the balanced properties starting at the lowest such unbalanced node and working up.Since each one only takes ammortized constant time,and there are O(lg(n))many trees made unbalanced,tot total time to rebalanced every subtree is O(lg(n))ammortized time.Problem17-4a.If we insert a node into a complete binary search tree whose lowest level isall red,then there will beΩ(lg n)instances of case1required to switch the colors all the way up the tree.If we delete a node from an all-black,com-plete binary tree then this also requiresΩ(lg n)time because there will be instances of case2at each iteration of the while-loop.b.For RB-INSERT,cases2and3are terminating.For RB-DELETE,cases1and3are terminating.c.After applying case1,z’s parent and uncle have been changed to black andz’s grandparent is changed to red.Thus,there is a ned loss of one red node,7soΦ(T )=Φ(T)−1.d.For case1,there is a single decrease in the number of red nodes,and thusa decrease in the potential function.However,a single call to RB-INSERT-FIXUP could result inΩ(lg n)instances of case1.For cases2and3,the colors stay the same and each performs a rotation.e.Since each instance of case1requires a specific node to be red,it can’tdecrease the number of red nodes by more thanΦ(T).Therefore the po-tential function is always non-negative.Any insert can increase the number of red nodes by at most1,and one unit of potential can pay for any struc-tural modifications of any of the3cases.Note that in the worst case,the call to RB-INSERT has to perform k case-1operations,where k is equal toΦ(T i)−Φ(T i−1).Thus,the total amortized cost is bounded above by 2(Φ(T n)−Φ(T0))≤n,so the amortized cost of each insert is O(1).f.In case1of RB-INSERT,we reduce the number of black nodes with two redchildren by1and we at most increase the number of black nodes with no red children by1,leaving a net loss of at most1to the potential function.In our new potential function,Φ(T n)−Φ(T0)≤n.Since one unit of potential pays for each operation and the terminating cases cause constant structural changes,the total amortized cost is O(n)making the amortized cost of each RB-INSERT-FIXUP O(1).g.In case2of RB-DELETE,we reduce the number of black nodes with two redchildren by1,thereby reducing the potential function by2.Since the change in potential is at least negative1,it pays for the structural modifications.Since the other cases cause constant structural changes,the total amortized cost is O(n)making the amortized cost of each RB-DELETE-FIXUP O(1).h.As described above,whether we insert or delete in any of the cases,the po-tential function always pays for the changes made if they’re nonterminating.If they’re terminating then they already take constant time,so the amortized cost of any operation in a sequence of m inserts and deletes is O(1),making the toal amortized cost O(m).Problem17-5a.Since the heuristic is picked in advance,given any sequence of requests givenso far,we can simulate what ordering the heuristic will call for,then,we will pick our next request to be whatever element will of been in the last position8of the list.Continuing until all the requests have been made,we have that the cost of this sequence of accesses is=mn.b.The cost offinding an element is=rank L(x)and since it needs to be swappedwith all the elements before it,of which there are rank L(x)−1,the total cost is2·rank L(x)−1.c.Regardless of the heuristic used,wefirst need to locate the element,whichis left where ever it was after the previous step,so,needs rank Li−1(x).Afterthat,by definition,there are t i transpositions made,so,c∗i=rank Li−1(x)+t∗i.d.If we perform a transposition of elements y and z,where y is towards theleft.Then there are two cases.Thefirst is that thefinal ordering of the list in L∗i is with y in front of z,in which case we have just increased the numberof inversions by1,so the potential increases by2.The second is that in L∗I zoccurs before y,in which case,we have just reduced the number of inversions by one,reducing the potential by2.In both cases,whether or not there is an inversion between y or z and any other element has not changed,since the transposition only changed the relative ordering of those two elements.e.By definition,A and B are the only two of the four categories to placeelements that precede x in L i−1,since there are|A|+|B|elements preceding it,it’s rank in L i−1is|A|+|B|+1.Similarly,the two categories in which an element can be if it precedes x in L∗i−1are A and C,so,in L∗i−1,x has rank|A|+|C|+1.f.We have from part d that the potential increases by2if we transpose twoelements that are being swapped so that their relative order in thefinal ordering is being screwed up,and decreases by two if they are begin placed into their correct order in L∗i.In particular,they increase it by at most2.since we are keeping track of the number of inversions that may not be the direct effect of the transpositions that heuristic H made,we see which ones the Move to front heuristic may of added.In particular,since the move to front heuristic only changed the relative order of x with respect to the other elements,moving it in front of the elements that preceded it in L i−1,we only care about sets A and B.For an element in A,moving it to be behind A created an inversion,since that element preceded x in L∗i.However,if the element were in B,we are removing an inversion by placing x in front of it.g.First,we apply parts b and f to the expression forˆc i to getˆc i≤2·rank L(x)−1+2(|A|−|B|+t∗i).Then,applying part e,we get this is=2(|A|+|B|+1)−1+2(|A|−|B|+t∗i)=4|A|−1+2t∗i≤4(|A|+|C|+1)+4t∗i=4(rank L∗i−1(x)+t∗i).Finally,by part c,this bound is equal to4c∗i.h.We showed that the amortized cost of each operation under the move to frontheuristic was at most four times the cost of the operation using any other heuristic.Since the amortized cost added up over all these operation is at most the total(real)cost,so we have that the total cost with movetofront is at most four times the total cost with an arbitrary other heuristic.9。
算法导论 第三版 第35章 答案 英
Chapter35Michelle Bodnar,Andrew LohrApril12,2016Exercise35.1-1We could select the graph that consists of only two vertices and a single edge between them.Then,the approximation algorithm will always select both of the vertices,whereas the minimum vertex cover is only one vertex.more generally,we could pick our graph to be k edges on a graph with2k vertices so that each connected component only has a single edge.In these examples,we will have that the approximate solution is offby a factor of two from the exact one.Exercise35.1-2It is clear that the edges picked in line4form a matching,since we can only pick edges from E ,and the edges in E are precisely those which don’t share an endpoint with any vertex already in C,and hence with any already-picked edge. Moreover,this matching is maximal because the only edges we don’t include are the ones we removed from E .We did this because they shared an endpoint with an edge we already picked,so if we added it to the matching it would no longer be a matching.Exercise35.1-3We will construct a bipartite graph with V=R∪L.We will try to construct it so that R is uniform,not that R is a vertex cover.However,we will make it so that the heuristic that the professor(professor who?)suggests will cause us to select all the vertices in L,and show that|L|>2|R|.Initially start offwith|R|=nfixed,and L empty.Then,for each i from2up to n,we do the following.Let k= ni .Select S a subset of the verticesof R of size ki,and so that all the vertices in R−S have a greater or equal degree.Then,we will add k vertices to L,each of degree i,so that the union of their neighborhoods is S.Note that throughout this process,the furthest apart the degrees of the vertices in R can be is1,because each time we are picking the smallest degree vertices and increasing their degrees by1.So,once this has been done for i=n,we can pick a subset of R whose degree is one less than the rest of R(or all of R if the degrees are all equal),and for each vertex in1that set we picked,add a single vertex to L whose only neighbor is the one in R that we picked.This clearly makes R uniform.Also,lets see what happens as we apply the heuristic.Note that each vertex in R only has at most a single vertex of each degree in L .This means that as we remove vertices from L along with their incident edges,we will always have that the highest degree vertex remaining in L is greater or equal to the highest degree vertex in R .This means that we can always,by this heuristic,continue to select vertices from L instead of R .So,when we are done,we have selected,by this heuristic,that our vertex cover is all of L .Lastly,we need to show that L is big enough relative to R .The size of L is greater or equal to n i =2 ni where we ignore any of the degree 1verticeswe may of added to L in our last step.This sum can be bounded below by the integral n +1i =2n x dx by formula (A.12).Elementary calculus tells us that this integral evaluates to n (lg(n +1)−1),so,we can clearly select n >8to make it so that2|R |=2n<n (lg(8+1)−1)≤n (lg(n +1)−1)= n +1i =2n x dx ≤n i =2n i ≤|L |Since we selected L as our vertex cover,and L is more than twice the size of the vertex cover R ,we do not have a 2-approximation using this heuristic.In fact,we have just shown that this heuristic is not a ρapproximation for any constant ρ.Exercise 35.1-4If a tree consists of a single node,we immediately return the empty cover and are done.From now on,assume that |V |≥2.I claim that for any tree T ,and any leaf node v on that tree,there exists an optimal vertex cover for T which doesn’t contain v .To see this,let V ⊂V be an optimal vertex cover,and suppose that v ∈V .Since v has degree 1,let u be the vertex connected to v .We know that u can’t also be in V ,because then we could remove v and still have an vertex cover,contradicting the fact that V was claimed to be optimal,and hence smallest possible.Now let V be the set obtained by removing v from V and adding u to V .Every edge not incident to u or v has an endpoint in V ,and thus in V .Moreover,every edge incident to u is taken care of because u ∈V .In particular,the edge from v to u is still okay because u ∈V .Therefore V is a vertex cover,and |V |=|V |,so it is2optimal.We may now write down the greedy approach,given in the algorithm GREEDY-VERTEX-COVER:Algorithm1GREEDY-VERTEX-COVER(G)1:V =∅2:let L be a list of all the leaves of G3:while V=∅do4:if|V|==1or0then5:return V6:end if7:let v be a leaf of G=(V,E),and{v,u}be its incident edge8:V=V−v9:V =V ∪u10:for each edge{u,w}∈E incident to u do11:if d w==1then12:L.insert(w)13:end if14:E=E−{u,w}15:end for16:V=V−u17:end whileAs it stands,we can’t be sure this runs in linear time since it could take O(n) time tofind a leaf each time we run line7.However,with a clever implementa-tion we can get around this.Keep in mind that a vertex either starts as a leaf, or becomes a leaf when an edge connecting it to a leaf is removed from it.We’ll maintain a list L of current leaves in the graph.We canfind all leaves initially in linear time in line2.Assume we are using an adjacency list representation. In line4we check if|V|is1or0.If it is,then we are done.Otherwise,the tree has at least2vertices which implies that it has a leaf.We can get our hands on a leaf in constant time in line7by popping thefirst element offof the list L,which maintains our leaves.We canfind the edge{u,v}in constant time by examining v’s adjacency list,which we know has size1.As described above, we know that v isn’t contained in an optimal solution.However,since{u,v} is an edge and at least one of its endpoints must be contained in V ,we must necessarily add u.We can remove v from V in constant time,and add u to V in constant time.Line10will only execute once for each edge,and since G is a tree we have|E|=|V|−1.Thus,the total contribution of the for-loop of line 10is linear.We never need to consider edges adjacent to u since u∈V .We check the degrees as we go,adding a vertex to L if we discover it has degree 1,and hence is a leaf.We can update the attribute d w for each w in constant time,so this doesn’t affect the runtime.Finally,we remove u from V and never again need to consider it.3Exercise35.1-5It does not imply the existence of an approximation algorithm for the max-imum size clique.Suppose that we had in a graph of size n,the size of the smallest vertex cover was k,and we found one that was size2k.This means that in the compliment,we found a clique of size n−2k,when the true size of the largest clique was n−k.So,to have it be a constant factor approximation, we need that there is someλso that we always have n−2k≥λ(n−k).However,if we had that k was close to n2for our graphs,say n2− ,then we would haveto require2 ≥λn2+ .Since we can make stay tiny,even as n grows large,this inequality cannot possibly hold.Exercise35.2-1Suppose that c(u,v)<0and w is any other vertex in the graph.Then,to have the triangle inequality satisfied,we need c(w,u)≤c(w,v)+c(u,v).Now though,subtract c(u,v)from both sides,we get c(w,v)≥c(w,u)−c(u,v)> c(w,u)+c(u,v)so,it is impossible to have c(w,v)≤c(w,u)+c(u,v)as the triangle inequality would require.Exercise35.2-2Let m be some value which is larger than any edge weight.If c(u,v)denotes the cost of the edge from u to v,then modify the weight of the edge to be H(u,v)=c(u,v)+m.(In other words,H is our new cost function).First we show that this forces the triangle inequality to hold.Let u,v,and w be ver-tices.Then we have H(u,v)=c(u,v)+m≤2m≤c(u,w)+m+c(w,v)+m= H(u,w)+H(w,v).Note:it’s important that the weights of edges are nonneg-ative.Next we must consider how this affects the weight of an optimal tour.First, any optimal tour has exactly n edges(assuming that the input graph has exactly n vertices).Thus,the total cost added to any tour in the original setup is nm. Since the change in cost is constant for every tour,the set of optimal tours must remain the same.To see why this doesn’t contradict Theorem35.3,let H denote the cost of a solution to the transformed problem found by aρ-approximation algorithm and H∗denote the cost of an optimal solution to the transformed problem. Then we have H≤ρH∗.We can now transform back to the original problem, and we have a solution of weight C=H−nm,and the optimal solution has weight C∗=H∗−nm.This tells us that C+nm≤ρ(C∗+nm),so that C≤ρ(C∗)+(ρ−1)nm.Sinceρ>1,we don’t have a constant approximation ratio,so there is no contradiction.Exercise35.2-34From the chapter on minimum spanning trees,recall Prim’s algorithm.That is,a minimum spanning tree can be found by repeatedlyfinding the nearest ver-tex to the vertices already considered,and adding it to the tree,being adjacent to the vertex among the already considered vertices that is closest to it.Note also,that we can recusively define the preorder traversal of a tree by saying that wefirst visit our parent,then ourselves,then our children,before returning priority to our parent.This means that by inserting vertices into the cycle in this way,we are always considering the parent of a vertex before the child.To see this,suppose we are adding vertex v as a child to vertex u.This means that in the minimum spanning tree rooted at thefirst vertex,v is a child of u.So, we need to consider ufirst before considering v,and then consider the vertex that we would of considered after v in the previous preorder traversal.This is precisely achieved by inserting v into the cycle in such a manner.Since the property of the cycle being a preorder traversal for the minimum spanning tree constructed so far is maintained at each step,it is the case at the end as well, once we havefinished considering all the vertices.So,by the end of the process, we have constructed the preorder traversal of a minimum spanning tree,even though we never explicity built the spanning tree.It was shown in the sec-tion that such a Hamiltonian cycle will be a2approximation for the cheapest cycle under the given assumption that the weights satisfy the triangle inequality. Exercise35.2-4By Problem23-3,there exists a linear time algorithm to compute a bottle-neck spanning tree of a graph,and recall that every bottleneck spanning tree is in fact a minimum spanning tree.First run this linear time algorithm tofind a bottleneck tree BT.Next,take full walk on the tree,skipping at most2con-secutive intermediate nodes to get from one unrecorded vertex to the next.By Exercise34.2-11we can always do this,and obtain a graph with a hamiltonian cycle which we will call HB.Let B denote the cost of the most costly edge in the bottleneck spanning tree.Consider the cost of any edge that we put into HB which was not in BT.By the triangle inequality,it’s cost is at most3B, since we traverse a single edge instead of at most3to get from one vertex to the next.Let hb be the cost of the most costly edge in HB.Then we have hb≤3B. Thus,the most costly edge in HB is at most3B.Let B∗denote the cost of the most costly edge an optimal bottleneck hamiltonian tour HB∗.Since we can obtain a spanning tree from HB∗by deleting the most costly edge in HB∗,the minimum cost of the most costly edge in any spanning tree is less than or equal to the cost of the most costly edge in any Hamiltonian cycle.In other words, B≤B∗.On the other hand,we have hb≤3B,which implies hb≤3B∗,so the algorithm is3-approximate.Exercise35.2-5To show that the optimal tour never crosses itself,we will suppose that it did cross itself,and then show that we could produce a new tour that had5lower cost,obtaining our contradiction because we had said that the tour we had started with was optimal,and so,was of minimal cost.If the tour crosses itself,there must be two pairs of vertices that are both adjacent in the tour,so that the edge between the two pairs are crossing each other.Suppose that our tour is S1x1x2S2y1y2S3where S1,S2,S3are arbitrary sequences of vertices,and {x1,x2}and{y1,y2}are the two crossing pairs.Then,We claim that the tour given by S1x1y2Reverse(S2)y1x2S3has lower cost.Since{x1,x2,y1,y2}form a quadrilateral,and the original cost was the sum of the two diagonal lengths, and the new cost is the sums of the lengths of two opposite sides,this problem comes down to a simple geometry problem.Now that we have it down to a geometry problem,we just exercise our grade school geometry muscles.Let P be the point that diagonals of the quadri-lateral intersect.Then,we have that the vertices{x1,P,y2}and{x2,P,y1} form triangles.Then,we recall that the longest that one side of a trian-gle can be is the sum of the other two sides,and the inequality is strict if the triangles are non-degenerate,as they are in our case.This means that ||x1y2||+||x2y1||<||x1P||+||P y2||+||x2P||+||P y1||=||x1x2||+||y1y2||.The right hand side was the original contribution to the cost from the old two edges, while the left is the new contribution.This means that this part of the cost has decreased,while the rest of the costs in the path have remained the same.This gets us that the new path that we constructed has strictly better cross,so we must not of had an optimal tour that had a crossing in it.Exercise35.3-1Since all of the words have no repeated letters,thefirst word selected will be the one that appears earliest on among those with the most letters,this is “thread”.Now,we look among the words that are left,seeing how many let-ters that aren’t already covered that they contain.Since“lost”has four letters that have not been mentioned yet,and it isfirst among those that do,that is the next one we select.The next one we pick is“drain”because it is has two unmentioned letters.This only leave“shun”having any unmentioned letters, so we pick that,completing our set.So,thefinal set of words in our cover is {thread,lost,drain,shun}.Exercise35.3-2A certificate for the set-covering problem is a list of which sets to use in the covering,and we can check in polynomial time that every element of X is in at least one of these sets,and that the number of sets doesn’t exceed k. Thus,set-covering is in NP.Now we’ll show it’s NP-hard by reducing it from the vertex-cover problem.Suppose we are given a graph G=(V,E).Let V denote the set of vertices of G with all vertices of degree0removed.To each vertex v∈V,associate a set S v which consists of v and all of its neighbors,and let F={S v|v∈V }.If S⊂V is a vertex cover of G with at most k vertices,then {S v|v∈S∩V }is a set cover of V with at most k sets.On the other hand,sup-6pose there doesn’t exist a vertex cover of G with at most k vertices.If there were a set cover M of V with at most k sets from F ,then we could use {v |S v ∈M }as a k -element vertex cover of G ,a contradiction.Thus,G has a k element vertex cover if and only if there is a k -element set cover of V using elements in F .Therefore set-covering is NP-hard,so we conclude that it is NP-complete.Exercise 35.3-3See the algorithm LINEAR-GREEDY-SET-COVER.Note that everything in the inner most for loop takes constant time and will only run once for each pair of letter and a set containing that letter.However,if we sum up the number of such pairs,we get S ∈F |S |which is what we wanted to be linear in.Algorithm 2LINEAR-GREEDY-SET-COVER(F )compute the sizes of every S ∈F ,storing them in S.size .let A be an array of length max S |S |,consisting of empty listsfor S ∈F doadd S to A [S.size ].end forlet A.max be the index of the largest nonempty list in A .let L be an array of length |∪S ∈F S |consisting of empty listsfor S ∈F dofor ∈S doadd S to L [ ]end forend forlet C be the set cover that we will be selecting,initially empty.let T be the set of letters that have been covered,initially empty.while A.max >0doLet S 0be any element of A [A.max ].add S 0to Cremove S 0from A [A.max ]for ∈S 0\T dofor S ∈L [ ]doRemove S from A [A.size ]S.size =S.size -1Add S to A [S.size ]if A[A.max]is empty thenA.max =A.max-1end ifend foradd to Tend forend while7Exercise 35.3-4Each c x has cost at most 1,so we we can trivially replace the upper bound in inequality (35.12)by x ∈S c x ≤|S |≤max {|S |:S ∈F }.Combining inequality (35.11)and the new (35.12),we have|C |≤ S ∈C ∗ x ∈S c x ≤ S ∈C ∗max {|S |:S ∈F }=|C ∗|max {|S |:S ∈F }.Exercise 35.3-5Suppose we pick the number of elements in our base set to be a multiple of four.We will describe a set of sets on a base set of size 4,and then take n disjoint copies of it.For each of the four element base sets,we will have two choices for how to select the set cover of those 4elements.For a base set con-sisting of {1,2,3,4},we pick our set of sets to be {{1,2},{1,3},{3,4},{2,4}},then we could select either {{1,2},{3,4}}or {{1,3},{2,4}}.This means that we then have a set cover problem with 4n sets,each of size two where the set cover we select is done by n independent choices,and so there are 2n possible final set covers based on how ties are resolved.Exercise 35.4-1Any clause that contains both a variable and its negation is automatically satisfied,since we always have x ∨¬x is true regardless of the truth value of x .This means that if we separate out the clauses that contain no variable and its negation,we have an 8/7ths approximation on those,and we have all of the other clauses satisfied regardless of the truth assignments to variables.So,the quality of the approximation just improves when we include the clauses con-taining variables and their negation.Exercise 35.4-2As usual,we’ll assume that each clause contains only at most instance of each literal,and that it doesn’t contain both a literal and its negation.Assign each variable 1with probability 1/2and 0with probability 1/2.Let Y i be the random variable which takes on 1if clause i is satisfied and 0if it isn’t.The probability that a clause fails to be satisfied is (1/2)k ≤1/2where k is the number of literals in the clause,so k ≥1.Thus,P (Y i )=1−P (Y i )≥1/2.Let Y be the total number of clauses satisfied and m be the total number of clauses.Then we have E [Y ]=m i =1E [Y i ]≥m/2.Let C ∗be the number of clauses satisfied by an optimal solution.Then C ∗≤m so we have C ∗/E [Y ]≤m/(m/2)=2.Thus,this is a randomized 82-approximation algorithm.Exercise35.4-3Lets consider the expected value of the weight of the cut.For each edge, the probability that that edge crosses the cut is the probability that our coin flips came up differently for the two vertices that are in the edge.This happens with probability12.Therefore,by linearity of expectation,we know that theexpected weight of this cut is|E|2.We know that for the best cut we can make,the weight will be bounded by the total number of edges in the graph,so we have that the weight of the best cut is at most twice the expected weight of this random cut.Exercise35.4-4Let x:V→R≥0be an optimal solution for the linear-programming relax-ation with condition(35.19)removed,and suppose there exists v∈V such that x(v)>1.Now let x be such that x (u)=x(u)for u=v,and x (v)=1.Then (35.18)and(35.20)are still satisfied for x .However,u∈V w(u)x(u)=u∈V−vw(u)x (u)+w(v)x(v)>u∈V−vw(u)x (u)+w(v)x (v) =u∈Vw(u)x (u)which contradicts the assumption that x minimized the objective function. Therefore it must be the case that x(v)≤1for all v∈V,so the condition (35.19)is redundant.Exercise35.5-1Every subset of{1,2,...,i}can either contain i or not contain i.If it does contain i,the sum corresponding to that subset will be in P i−1+x i,since the sum corresponding to the restriction of the subset to{1,2,3,...}will be in P i−1. If we are in the other case,then when we restrict to{1,2,...,i−1}we aren’t changing the subset at all.Similarly,if an element is in P i−1,that same subset is in P i.If an element is in P i−1+x i,then it is in P i where we just make sure our subset contains i.This proves(35.23).It is clear that L is a sorted list of elements less than T that corresponds to subsets of the empty set before executing the for loop,because it is empty. Then,since we made L i from elements in L i−1and x i+Li−1,we know that it will be a subset of those sums obtained from thefirst i elements.Also,since both L i−1and x i+L i−1were sorted,when we merged them,we get a sorted9stly,we know that it all sums except those that are more than t since we have all the subset sums that are not more than t in L i−1,and we cut out anything that gets to be more than t.Exercise35.5-2We’ll proceed by induction on i.When i=1,either y=0in which case the claim is trivially true,or y=x1.In this case,L1={0,x1}.We don’t lose any elements by trimming since0(1+δ)<x1∈Z>0.Since we only care about elements which are at most t,the removal in line6of APPROX-SUBSET-SUM doesn’t affect the inequality.Since x1/(1+ε/2n)≤x1≤x1,the claim holds when i=1.Now suppose the claim holds for i,where i≤n−1.We’ll show that the claim holds for i+1.Let y∈P i+1.Then by(35.23)either y∈P i or y∈P i+x i+1.If y∈P i,then by the induction hypothesis there existsz∈L i such that y(1+ε/2n)i+1≤y(1+ε/2n)i≤z≤y.If z∈L i+1then we’re done.Otherwise,z must have been trimmed,which means there exists z ∈L i+1such that z/(1+δ)≤z ≤z.Sinceδ=ε/2n,we have y(1+ε/2n)i+1≤z ≤z≤y,so inequality(35.26)is satisfistly,we handle the case where y∈P i+x i+1. Write y=p+x i+1.By the induction hypothesis,there exists z∈L i such that p(1+ε/2n)i≤z≤p.Since z+x i+1∈L i+1,before thinning,this means thatp+x i+1 (1+ε/2n)i ≤p(1+ε/2n)i+x i+1≤z+x i+1≤p+x i+1,so z+x i+1well approximates p+x i+1.If we don’t thin this out,then weare done.Otherwise,there exists w∈L i+1such that z+x i+11+δ≤w≤z+x i+1.Then we havep+x i+1 (1+ε/2n)i+1≤z+x i+11+ε/2n≤w≤z+x i+1≤p+x i+1.Thus,claim holds for i+1.By induction,the claim holds for all1≤i≤n, so inequality(35.26)is true.Exercise35.5-310As we have many times in the past,we’ll but on our freshman calculus hats.d dn 1+ 2nn =d dn e n lg (1+ 2n )=e n lg (1+ 2n ) 1+ 2n +n − 2n 21+ 2n =e n lg (1+ 2n ) 1+ 2n 2− 2n 1+ 2n =e n lg (1+ 2n ) 1+ 2n + 2n 21+ 2n=Since all three factors are always positive,the original expression is always positive.Exercise 35.5-4We’ll rewrite the relevant algorithms for finding the smallest value,modify-ing both TRIM and APPROX-SUBSET-SUM.The analysis is the same as that for finding a largest sum which doesn’t exceed t ,but with inequalities reversed.Also note that in TRIM,we guarantee instead that for each y removed,there exists z which remains on the list such that y ≤z ≤y (1+δ).Algorithm 3TRIM(L,δ)1:let m be the length of L2:L = y m3:last =y m4:for i =m −1downto 1do5:if y i <last/(1+δ)then6:append y i to the end of L7:last =y i8:end if9:end for10:return L’Exercise 35.5-5We can modify the procedure APPROX-SUBSET-SUM to actually report the subset corresponding to each sum by giving each entry in our L i lists a piece of satellite data which is a list the elements that add up to the given number sitting in L i .Even if we do a stupid representation of the sets of elements,we will still have that the runtime of this modified procedure only takes additional11Algorithm 4APPROX-SUBSET-SUM(S,t,ε)1:n =|S |2:L 0= n i =1x i3:for i =1to n do4:L i =MERGE-LISTS(L i −1,L i −1−x i )5:L i =TRIM(L i ,ε/2n )6:return from L i every element that is less than t7:end for8:let z ∗be the largest value in L n9:return z ∗time by a factor of the size of the original set,and so will still be polynomial.Since the actual selection of the sum that is our approximate best is unchanged by doing this,all of the work spent in the chapter to prove correctness of the approximation scheme still holds.Each time that we put an element into L i ,it could of been copied directly from L i −1,in which case we copy the satellite data as well.The only other possibility is that it is x i plus an entry in L i −1,in which case,we add x i to a copy of the satellite data from L i −1to make our new set of elements to associate with the element in L i .Problem 35-1a.First,we will show that it is np hard to determine if,given a set of numbers,there is a subset of them whose sum is equal to the sum of that set’s compli-ment,this is called the partition problem.We will show this is NP hard by using it to solve the subset sum problem.Suppose that we wanted to fund a subset of {y 1,y 2,...y n }that summed to t .Then,we will run partition on the set {y 1,y 2,...,y n ,( i y i )−2t }.Note then,that the sum of all the elements in this set is 2( i y i )−2t .So,any partition must have both sides equal to half that.If there is a subset of the original set that sums to t ,we can put that on one side together with the element we add,and put all the other original elements on the other side,giving us a partition.Suppose that we had a partition,then all the elements that are on the same side as the special added element form a subset that is equal to t .This show that the partition problem is NP hard.Let {x 1,x 2,...,x n }be an instance of the partition problem.Then,we will construct an instance of a packing problem that can be packed into 2bins if and only if there is a subset of {x 1,x 2,...x n }with sum equal to that of its compliment.To do this,we will just let our values be c i =2x i n j =1x j.Then,the total weight is exactly 2,so clearly two bins are needed.Also,it can fit in two bins if there is a partition of the original set.b.If we could pack the elements in to fewer than S bins,that means that the total capacity from our bins is < S ≤S ,however,we know that to total12space needed to store the elements is S,so there is no way we couldfit them in less than that amount of space.c.Suppose that there was already one bin that is at most half full,then whenwe go to insert an element that has size at most half,it will not go into an unused bin because it would be placed in this bin that is at most half full.This means that we will never create a second bin that is at most half full, and so,since we start offwith fewer that two bins that are at most half full, there will never be two bins that are at most half full(and so never two that are less than half full).d.Since there is at most one bin that is less than half full,we know that thetotal amount of size that we have packed into our P bins is>12(P−1).Thatis,we know that S>12(P−1),which tells us that2S+1>P.So,if we wereto have P> 2S ,then,we have that P≥ 2S +1= 2S+1 ≥2S+1>P, which is a contradiction.e.We know from part b that there is a minimum of S bins required.Also,by part d,we know that thefirstfit heuristic causes us to sue at most 2S bins.This means that the number of bins we report is at most offby a factor of 2SS≤2.f.We can implement thefirstfit heuristic by just keeping an array of bins,andeach time just doing a linear scan tofind thefirst bin that can accept it.So,if we let P be the number of bins,this procedure will have a runtime of O(P2)=O(n2).However,since all we needed was that there was at most one bin that was less than half full,we could do a faster procedure.We keep the array of bins as before,but we will keep track of thefirst empty bin anda pointer to a bin that is less than half full.Upon insertion,if the thing weinserted is more than half,put it in thefirst empty bin and increment it.If it is less than half,it willfit in the bin that is less than half full,if that bin then becomes more than half full,get rid of the less than half full bin pointer.If there wasn’t a nonempty bin that was less than half full,we just put the element in thefirst empty bin.This will run in time O(n)and still satisfy everything we needed to assure we had a2-approximation. Problem35-2a.Given a clique D of m vertices in G,let D k be the set of all k-tuples ofvertices in D.Then D k is a clique in G(k),so the size of a maximum clique in G(k)is at least that of the size of a maximum clique in G.We’ll show that the size cannot exceed that.Let m denote the size of the maximum clique in G.We proceed by induction on k.When k=1,we have V(1)=V and E(1)=E,so the claim is trivial.Now suppose that for k≥1,the size of the maximum clique in G(k)is equal to the kth power of the size of the maximum clique in G.Let u be a(k+1)-tuple and u denote the restriction of u to a k-tuple consisting of itsfirst k13。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
exchange AŒj with AŒsmallest The algorithm maintains the loop invariant that at the start of each iteration of the outer for loop, the subarray AŒ1 : : j 1 consists of the j 1 smallest elements in the array AŒ1 : : n, and this subarray is in sorted order. After the first n 1 elements, the subarray AŒ1 : : n 1 contains the smallest n 1 elements, sorted, and therefore element AŒn must be the largest element. The running time of the algorithm is ‚.n2/ for all cases.
ITERATIVE-BINARY-SEARCH.A; ; low; high/
while low high mid D b.low C high/=2c if == AŒmid return mid elseif > AŒmid low D mid C 1 else high D mid 1
return NIL
RECURSIVE-BINARY-SEARCH.A; ; low; high/
if low > high return NIL
mid D b.low C high/=2c if == AŒmid
return mid elseif > AŒmid
return RECURSIVE-BINARY-SEARCH.A; ; mid C 1; high/ else return RECURSIVE-BINARY-SEARCH.A; ; low; mid 1/
Selected Solutions for Chapter 2: Getting Started
2-3
d. We follow the hint and modify merge sort to count the number of inversions in ‚.n lg n/ time.
To start, let us define a merge-inversion as a situation within the execution of merge sort in which the MERGE procedure, after copying AŒp : : q to L and AŒq C 1 : : r to R, has values x in L and y in R such that x > y. Consider an inversion .i; j /, and let x D AŒi and y D AŒj , so that i < j and x > y. We claim that if we were to run merge sort, there would be exactly one mergeinversion involving x and y. To see why, observe that the only way in which array elements change their positions is within the MERGE procedure. Moreover, since MERGE keeps elements within L in the same relative order to each other, and correspondingly for R, the only way in which two elements can change their ordering relative to each other is for the greater one to appear in L and the lesser one to appear in R. Thus, there is at least one merge-inversion involving x and y. To see that there is exactly one such merge-inversion, observe that after any call of MERGE that involves both x and y, they are in the same sorted subarray and will therefore both appear in L or both appear in R in any given call thereafter. Thus, we have proven the claim.
The number of such inversions is
n.
c. Suppose that the array A starts out with an inversion .k; j /. Then k < j and AŒk > AŒj . At the time that the outer for loop of lines 1–8 sets key D AŒj , the value that started in AŒk is still somewhere to the left of AŒj . That is, it’s in AŒi, where 1 i < j , and so the inversion has become .i; j /. Some iteration of the while loop of lines 5–7 moves AŒi one position to the right. Line 8 will eventually drop key to the left of this element, thus eliminating the inversion. Because line 5 moves only elements that are less than key, it moves only elements that correspond to inversions. In other words, each iteration of the while loop of lines 5–7 corresponds to the elimination of one inversion.
2-2
Selected Solutions for Chapter 2: Getting Started
AŒlow : : high contains the value . The initial call to either version should have the parameters A; ; 1; n.
Solution to Exercise 2.2-4
Modify the algorithm so it tests whether the input satisfies some special-case condition and, if it does, output a pre-computed answer. The best-case running time is generally not a good measure of an algorithm.
Both procedures terminate the search unsuccessfully when the range is empty (i.e., low > high) and terminate it successfully if the value has been found. Based on the comparison of to the middle element in the searched range, the search continues with the range halved. The recurrence for these procedures is therefore T .n/ D T .n=2/ C ‚.1/, whose solution is T .n/ D ‚.lg n/.
Selected Solutions for Chapter 2: Getting Started
Solution to Exercise 2.2-2
SELECTION-SORT.A/ n D A:length for j D 1 to n 1
smallest D j for i D j C 1 to n
b. The array with elements from f1; 2; : : : ; ng with the most inversions is
hn; n 1; n 2; : : : ; 2; 1i. For all 1 i < j n, there is an inversion .i; j /.
Solution to Exercise 2.3-5
Procedure BINARY-SEARCH takes a sorted array A, a value , and a range Œlow : : high of the array, in which we search for the value . The procedure compares to the array entry at the midpoint of the range and decides to eliminate half the range from further consideration. We give both iterative and recursive versions, each of which returns either an index i such that AŒi D , or NIL if no entry of