欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MIT算法导论公开课之第6课 顺序统计、中值

程序员文章站 2024-02-13 22:56:58
...

顺序统计问题:

有n个无序的数,找到第k小的数(所有元素的值不相等)。

朴素算法:

先排序,第k号元素即为第k小的数。
k=1时,即为最小值。
k=n时,即为最大值。
k=(n+1)/2向上或向下取整时,即为中位数。

随机选择算法(随机化的分治算法):

定义函数Rand-Select(A,p,q,i)。
在数组A中获得第i小的数。
  • 用分治策略可在数组的一部分A[p…q]中找第i小的数。
    1.如果p=q则返回A[p]。
    2.r ← Rand-Partition(A,p,q)。
    3.k ← r-p+1,k是划分元素的序号。
    MIT算法导论公开课之第6课 顺序统计、中值
    r的左边和右边分别是小于和大于r元素的数。
    4.如果i 等于 k即为所求值。
    如果i 小于 k那么返回Rand-Select(A,p,r-1,i)。
    如果i 大于 k那么返回Rand-Select(A,r+1,q,i-k)。
  • Ex:
    MIT算法导论公开课之第6课 顺序统计、中值
  • 运行时间:
    • 好的情况:
      划分时,按1/10 9/10划分。
      T(n)<=T(9/10·n)+Θ(n)= Θ(n)
    • 坏的情况:
      划分时,按0 n-1划分。
      T(n)=T(n-1)+Θ(n)=Θ(n^2)
    • 运行时间的期望:
      MIT算法导论公开课之第6课 顺序统计、中值
      MIT算法导论公开课之第6课 顺序统计、中值

最坏情况为线性时间复杂度的算法:

保证一个好的主元。
数组大小为n获得第i小的元素。
  • 算法步骤
    1.将数组画成5*(n/5)的方阵,找到每一组(五个数)的中值(时间复杂度为Θ(n))。
    2.递归的计算每一组中值的中值x(T(n/5))。
    3.把x作为划分主元,进行划分 k ← x-p+1(T(n))。
    4.如果i 等于 k即为所求值。
    如果i 小于 k那么递归的继续处理数组的小值部分。
    如果i 大于 k那么递归的继续处理数组的大值部分(T(c·n) c应该要小于4/5)。
  • 运行时间:

    在5*(n/5)的方阵中可以分析出有至少3·[[n/5]/2]向下取整数量的数小于x。
    即有至少3·[n/10]向下取整数量的数小于x。
    当n足够大,时n/10取整再乘以3一定比n/4大。
    可得T(n)<=T(n/5)+T(3/4n)+Θ(n)。
    代换法证明线性时间复杂度:
        假设T(n)<=c·n。
        则有T(n)<=1/5·cn+3/4·cn+Θ(n)
                =19/20·cn+Θ(n)
                =cn-(1/20·cn-Θ(n))
    当c足够大时 (1/20·cn-Θ(n))非负。
    即证得此算法的最坏时间复杂度为线性时间复杂度。
    
相关标签: 算法导论