您的位置:首页 > 其它

《算法导论》笔记 第9章 9.2以期望线性时间做选择

2014-04-14 21:03 429 查看

【笔记】

在平均情况下,任何顺序统计(特别是中位数),都可以在线性时间内得到。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: