《算法导论》笔记 第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


posted on 2014-04-14 21:03  电子幼体  阅读(979)  评论(0编辑  收藏  举报

导航