《算法导论》笔记 第9章 9.2以期望线性时间做选择
【笔记】
在平均情况下,任何顺序统计(特别是中位数),都可以在线性时间内得到。
int partition(int A[],int p,int r) { int x = A[r]; int i = p-1; for (int j=p;j<r;j++) { if (A[j] <= x) { i++; swap(A[i],A[j]); } } swap(A[i+1],A[r]); return i+1; } int randomizedPartition(int A[],int p,int r) { int i = rand() % (r-p+1) + p; swap(A[r],A[i]); return partition(A,p,r); } int randomizedSelect(int A[],int p,int r,int i) { if (p==r) return A[p]; int q = randomizedPartition(A,p,r); int k = q-p+1; if (i==k) return A[q]; else if (i<k) return randomizedSelect(A,p,q-1,i); else return randomizedSelect(A,q+1,r,i-k); }
【习题】
9.2-1 证明:在RANDOMIZED-SELECT中,对长度为0的数组,不会进行递归调用。
情景1:当r=p时,直接返回A[p],不会出现长度为0的数组。
情景2:当r-p=1时,q=p或r。当q=p时此时答案要么在A[q]处,要么在A[r],当i=k时,返回A[q],否则对区间(q+1,r)递归,出现情景1。q=r时同理。
情景3:当r>p+1时,若q在边界处,即q=r或q=p,若答案在A[q]处,转到情景1。否则转到情景3或情景2。
因此递归过程中不会出现长度为0的数组。
9.2-2 证明:指示器随机变量Xk和T(max(k-1,n-k))是独立的。
9.2-3 写出RANDOMIZED-SELECT的一个迭代版本。
int NonRecursiveRandomizedSelect(int A[],int p,int r,int i) { while (p<r) { int q = randomizedPartition(A,p,r); int k = q-p+1; if (i==k) return A[q]; else if (i<k) r = q-1; else { p = q+1; i -= k; } } return A[p]; }
9.2-4 假设要用RANDOMIZED-SELECT 来选择数组 A=<3,2,9,0,7,5,4,8,6,1>中的最小元素。给出在RANDOMIZED-SELECT的最坏情况性能下的一个划分序列。
9、8、7、6、5、4、3、2、1、0 orz