代码改变世界

算法导论-中位数和顺序统计学习题解

2012-02-28 20:33  meteorgan  阅读(877)  评论(1编辑  收藏  举报

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

  解:n 个元素两两比较,取较小值再两两比较,继续这个过程,可用 n - 1 次比较找到最小值。此时,第2小值一定出现在与最小值比较过的元素组成的集合中,这个集合的大小为\lceil n \rceil,还需要\lceil n\rceil 次比较即可找到第2小值。

 

  9.3-6 对于一个含k个元素的集合来说,所谓k分位数就是能把已排序的结合分为k个大小相等的集合的k-1个顺序统计量。给出一个能列出某一集合的k分位数的O(nlgk)时间的算法。

解:1. 寻找第 \lfloor \frac{k}{2}\rfloor 个k分位数,时间为O(n)。这个分位数将集合分为大小大致相等的两部分S1, S2,令 k = \lfloor{\frac{k}{2}}\rfloor

    2. 分别在S1, S2中重复步骤1。

  3. 递归上述步骤直到 k = 1。递归次数为 O(lgk),每次递归执行总时间为O(n),算法时间复杂度为O(nlgk)。

 

 9.3-7 给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定S中最接近其中位数的k个数。

  解:1. 求S的中位数m,时间O(n)。

         2. 求 S - {m}中所有元素减去m的绝对值组成的集合B,时间O(n)。

         3. 求B中第k小的数n,时间O(n)。求得n后,n及n以前的k-1个数对应的S中的数即为S中最接近其中位数的k个数。

 

  9.3-8 设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有的2n个元素的中位数的O(lgn)的算法。

  解:1. 比较X[n/2] 与 Y[n/2]的大小,相等这个值就是中位数。否则,假设X[n/2] > Y[n/2],则中位数为X[1..n/2]和Y[n/2..n]这n个元素的中位数。

    2. 求X[1..n/2]和Y[n/2..n]这n个元素的中位数,方法如1。

    可以看到上述方法每次排除一半的元素,因此时间复杂度为O(lgn)。

 

9-2 带权中位数

  解 a) 略

      b) 略

      c) 1. 求X中位数m,令 W_{1} = \sum_{i=0}^{m-1}w{i}, W_{2} = \sum_{i=m}^{n}w_{i}

          2. 如果 W1 < 1/ 2 且 W2 < 1/2。则带权中位数为m。否则,假设 W1 < W2 ,令 w_{m+1} = w_{m+1} + W_{1} ,取X[m+1..n]作为新的X。

          3. 递归过程1、2,直到找到中位数。 时间复杂度递归公式 T(n) = T(n/2) + O(n),求解得:T(n) = O(n)。

     d) 只说思路:假设带权中位数为m, 任意一点p到各点距离为 f(p) = \sum_{i=1}^{n}w_{i}d(p, p_{i}) = \sum_{i=1}^{n}w_{i}|p - p_{i}|

       所要求证问题是: f(p) - f(m) >= 0, 即 f(p) - f(m) = \sum_{i=1}^{n}(|p - p_{i}| - |m - p_{i}|) \ge 0.

         分清况展开绝对项即可。

      e) 分别找到x, y方向的带权中位数。