Home 算法分析--顺序统计量
Post
Cancel

算法分析--顺序统计量

Minimum and maximum 最小值和最大值

最小值 Minimum

1
2
3
4
5
6
Minimum(A,n)
    mim = A[1]
    for i = 2 to n
        if A[i] < mim
            mim = A[i]
    return min

最大值 Maximum

1
2
3
4
5
6
Maximum(A,n)
    max = A[1]
    for i = 2 to n
        if A[i] > max
            max = A[i]
    return max

同时搜索最大最小值

1
2
3
4
5
6
7
8
9
MINIMUM-AND-MAXIMUM(A,n)
    max = A[1]
    min = A[1]
    for i = 2 to n
        if A[i] > max
            max = A[i]
        if A[i] < mim
            mim = A[i]
    return min and max

找出中位数 Median

很多分治策略中都可以使用中位数而不需要排序。

1
2
3
4
5
6
7
MEDIAN-SELECT(A)
    Sort the array A
    if n is odd:
        return A[(n // 2)]
    else
        return (A[(n // 2) - 1] + A[(n // 2)]) / 2

顺序统计量

RANDOMIZED-SELECT 随机选择算法(线性时间)

找出第i个顺序统计量,找出数组A[p:r ]中第i小的元素 平均情况下为 $O(lgn)$ ,最坏情况为 $O(n^2)$ ,期望运行时间 $O(n)$

1
2
3
4
5
6
7
8
9
10
RANDOMIZED-SELECT(A,p,r,i)
    if p == r 
        return A[p]
    q = Rand-Partitian(A,p,r) 
    k = q - p + 1 
    if i == k
        return A[q]  
    else if i < k
        return RANDOMIZED-SELECT(A, p, q - 1, i)
    else return RANDOMIZED-SELECT(A, q + 1, r, i - k)
1
2
3
4
5
6
7
8
9
10
11
12
13
//迭代版
RANDOMIZED-SELECT(A, p, r, i)
    q = 0
    k = 0
    while TRUE 
        q = RANDOMIZED-PARTITION(a, p, r);
        k = q - p + 1;
        if i == k 
            return A[q]  // the pivot value is the answer
        elseif i < k
            r = q - 1
        else p = q + 1
            i = i - k
This post is licensed under CC BY 4.0 by the author.