无序集的中位数

时间:2015-02-18 20:51:46

标签: algorithm median unordered-set quick-search median-of-medians

我是一名compsci学生,我在Analysis& amp;设计II课程:

  

无序集的中位数是一个元素,其数量为   小于中位数的元素在元素数量之一内   假设没有联系,那就更大了。

     

(a)写一个算法,找到3个区间值a的中位数,   b,c。

     

(b)确定算法在中的比较次数   平均情况和最坏情况。

从我搜索和学习的小东西看,这似乎被称为找到未排序数组的第k个元素,或者找到中位数的中位数?

然而,我们尚未学习快速排序,而我所能找到的所有内容似乎比我在这里所要求的更为复杂。也就是说,我不完全确定我理解这个问题中的定义。此外,找到3个不同值a,b,c的中位数是否意味着找到一组3的中位数?

我不一定在找答案。只是简单的解释或澄清。感谢。


尝试#1

(a)按照templatetypedef的建议,我想出了这个天真的算法来解决这个问题:

medianOf(int a, int b, int c)
    if a < b
        if a > c
            return a
    else //a > b
        if a < c
            return a    

    if b < c
        if b > a
            return b
    else //b > c
        if b < a
            return b

    if c < a
        if c > b
            return c
    else //c > a
        if c < b
            return c

我知道这是非常天真和丑陋的,但我无法想出更好的解决方案,而且已经占用了我太多的时间。

(b)似乎最好的情况是当c&lt; a&lt; b具有2个比较,并且最坏的情况是当a&lt; c&lt; b与9次比较?那么,平均值是(2 + 9)/ 2,即5或6个比较?

现在天真?


尝试#2

(a)好的,所以,按照唐的建议,我努力将比较次数减到最少3.从数学上讲,我理解你的观点。检查a<b, b<c, a<c并从中扣除其余状态就足够了,但我找不到编码方法......这是我最好的尝试:

medianOf(int a, int b, int c)
    if a < b                                  1
        if c < a                              1
            return a    //c < a < b
        else  // a < b && a < c
            if b < c                          1
                return b    //a < b < c
            else
                return c    //a < c < b    

    else    //a > b
        if c > a                              1
            return a    //c > a > b
        else //a > b && a > c
            if b > c                          1
                return b    //a > b > c
            else                
                return c    //a > c > b

我不知道我怎么能比这更好:

(b)最佳案例:1比较。平均情况:5/2 = 2到3次比较。最坏情况:5次比较。

还好吗?


最终解决方案

感谢你,并且付出了很多努力,我终于明白了。我的最后一个算法是正确的,但我的计数错了。

(b)最佳案例:2次比较。平均情况:2次比较。最坏情况:3次比较。

2 个答案:

答案 0 :(得分:4)

幸运的是,我认为你是在思考这个问题。 :-)以这种方式思考 - 你能实现这个功能吗?

 int medianOf(int a, int b, int c) {
      ...
 }

您不必担心找到任意集的中位数。只需找到三个输入的中位数。

完成上述操作后,请查看您所做的比较,并考虑最佳情况,最差情况和平均情况下的比较次数。您可以直接计算您正在进行的比较,因为您的代码应该很短。

您正在考虑的中位数技术中位数是更常见的情况,即您拥有任意数量的元素,并希望获取所有元素的中位数。它肯定比这更复杂,但这似乎不是你被要求做的。

希望这有帮助!

答案 1 :(得分:0)

提示:

如果a&lt; = b且b <= c,那么b是中位数。

如果&lt; = b且b&gt; c和c> = a,则c是中位数。

如果&lt; = b且b&gt; c和c < a,然后a是中位数。

如果a> = b且b&gt; = c,那么b是中位数。

如果a> = b且b

如果a> = b且b

您可以在嵌套的if / else语句中对其进行编码,以便在返回答案之前执行2或3次比较。唯一的问题是最坏的情况,最好的情况,以及比较次数的平均情况。对于一般情况,您可能必须假设所有3个数字都是不同的(但是以随机顺序),否则&#34;等于&#34; case可以根据发生的频率改变平均比较次数。