zoukankan      html  css  js  c++  java
  • 算法导论第九章:中位数和顺序统计学

    在一个有n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。中位数是出现在i=(n+1)/2处(下中位)或i=(n+1)/2+1处(上中位)。

    9.1最小值和最大值

    在一个有n个元素的集合中,要做多少次比较才能确定其最小元素呢?可以很容易地给出n-1这个上界:依次查看集合中的每个元素,并记录比较过程中的最小元素。

    n-1也是这个问题的比较次数下界:对于任意一个确定最小值的算法,可以把它看做是在各元素之间进行的一场锦标赛,每次比较都是锦标赛中的一场比赛,两个元素中较小的一方获胜,有一点很关键,就是除了最终获胜者之外,每个元素都少输掉至少一场比赛;而至少有n-1场比赛。

    同时找出最大值可最小值

    我们可以独立地找出最大值和最小值,各用n-1次比较。事实上,至多3(n/2)次比较久足以同时找到最小值和最大值。做法是记录比较过程遇到的最小值和最大值。我们不是将每一个输入元素与当前的最大值和最小值进行比较。而是成对地处理元素。先将一对输入元素互相比较,然后把较大的与当前最大值进行比较,较小的与当前最小值进行比较,因此每对元素需要比较3次。

    练习:

    9.1-1证明:在最坏情况下,利用n+lgn-2次比较,即可以找到n个元素中的第2小的元素。

    参考答案:(从网上找的答案)

    将n个元素进行两两比较,将较大的淘汰,较小的留下。这样通过n/2次比较就剩下n/2个元素。再进行第二轮;如此往复直到得出最小的元素。这个过程可以用一棵二叉树来描述。那么第二小的元素只有在于最小元素的比较才会被淘汰。最小的元素进行过的元素有lgn-1个。于是在进行lgn-2次比较就可以得出第二小的元素。

    PS:这个解法的问题在于,如何记住与最小元素比较过的元素集合,难道要整棵树建出来。这样的话这个算法没有什么实际意义。

    9.2以期望线性时间做选择

     一般的选择问题比找最小值的简单问题更难,两种问题的渐进运行时间却是相同的都是Θ(n)。本节介绍一种解决选择问题的分治算法,即RANDOMIZED-SELECT算法,以第七章的快速排序算法为模型,如同在排序中一样,对输入的数组进行递归划分,但和快速排序不同的是,快速排序会递归处理划分的两边,而RANDOMIZED-SELECT只处理划分的一边。RANDOMIZED-SELECT的期望时间为Θ(n)。

    RANDOMIZED-SELECT(A,p,r,i)

    1  if p=r

    2    then return A[p]

    3  q<--RANDOMIZED-PARTITION(A,p,r)

    4  k<--q-p+1

    5  if i=k

    6    then return A[q]

    7  elseif i<k

    8    then return RANDOMIZED-SELECT(A,p,q-1,i)

    9 else return RANDOMIZED-SELECT(A,q+1,r,i-k)

    RANDOMIZED-PARTITION就是快速排序算法中的partition过程。

    RANDOMIZED-SELECT的最坏运行时间是n2。期望运行时间为n。

    思考题:

    9-2带权中位数

    对分别具有正的权重w1,w2,...,wn且∑wi=1的n个不同元素x1,x2,...,xn,带权中位数是满足如下条件的元素xk:∑(xi<xk)<1/2且∑(xi>xk)<=1/2。

    a)论证如果wi=1/n,那么x1,x2,x3...,xn的中位数即是带权中位数。

    假设集合xi的中位数为xk,满足xi<xk的元素个数和xi>xk的元素个数都约为n/2。所以满足带权中位数的定义。

    b)说明如何通过排序求出n个元素的带权中位数。

    对xi进行排序,依照排序后的顺序依次计算前k个权重的和。当第一次计算到某个位置发现权重和大于或等于1/2时,xk就为带权中位数。

    c)说明如何利用一的中位数算法,来求带权中位数。

    以RANDOMIZED-SELECT算法为例,我们以对xi的快速排序算法为基础,区别在于,我们不是寻找第k大的数,而是寻找使∑(xi<=xk)>=m满足的最小k位置。算法可以从RANDOMIZED-SELECT修改而来。

    WRANDOMIZED-SELECT(A,p,r,m)

    1  if p=r

    2    then return A[p]

    3  q<--RANDOMIZED-PARTITION(A,p,r)

    4  计算A[p...q]的权重和m'

    5  if m=m'

    6    then return A[q]

    7  elseif m<m'

    8    then return WRANDOMIZED-SELECT(A,p,q-1,m)

    9 else return WRANDOMIZED-SELECT(A,q+1,r,m'-m)

    邮局位置问题:已知n个点p1,p2,...,pn即它们相练习的权重w1,w2,...,wn。我们希望能找到一点p(不一定是输入点中的一个),使得何时∑wiD(p,pi)最小,此处D(a,b)表示点a与b之间的距离。

    d)证明带权中位数是一维邮局位置问题的最佳解决方案,其中所有的点都是实数。一维意味着d(a,b)=|a-b|。

    首先证明p点必然可以是输入点中的一点,采用反证法:假设p是pk和pk+1之间的一点。如果∑(i=1~k)wi>=1/2,那么pk点将是一个更优(或同优)的点,pk+1将是一个更优的点。在再证明带权中位数就是最优点,同样采用反证法:假设pk是带权中位点,那么对于如果选取pl(l<k),那么由于∑(i=1~l)wi<1/2,那么pl+1是一个更优的点。如果选取pm(m>k),那么由于∑(i=m~l)wi<1/2,那么pm-1是一个更优的点。

    e)找出二维邮局位置问题的最佳解答。其中所有的点都是(x,y)坐标对,并且点a(x1,y1)和b(x2,y2)之间的距离是Manhanttan距离:d(a,b) = |x1-x2|+|y1-y2|。

    只要分别从x1,x2,...,xn和y1,y2,...,yn找出带权中位数xi,yj。那么点(xi,yj)就是最佳位置。

  • 相关阅读:
    将十六进制的颜色字符串转为UIColor
    NSXMLParser读取XML文件并将数据显示到TableView上
    TouchJSON的简单使用
    NSJSONSerialization的简单用法
    Android 开发之修改 app 的字体大小(老人模式)
    android sqlite3:数据库操作
    设计模式-观察者模式(Observer Pattern)
    Android 7.0 介绍和适配问题
    Appium的安装和使用
    Android:使用 DownloadManager 进行版本更新,出现 No Activity found to handle Intent 及解决办法
  • 原文地址:https://www.cnblogs.com/longhuihu/p/10423390.html
Copyright © 2011-2022 走看看