繁体   English   中英

无序集合的中位数

[英]The median of an unordered set

我是一名补习生,在Analysis&Design 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 <a <b且有2个比较,而最坏的情况是a <c <b且有9个比较? 因此,平均值将是(2 + 9)/ 2,这是5或6个比较?

还是现在很天真?


尝试#2

(a)好吧,因此,根据thang的建议,我非常努力地将比较数减至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比较。

幸运的是,我认为您对此太想了。 :-)这样想-您可以实现此功能吗?

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

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

完成此操作后,请查看所做的比较,并考虑比较的最佳情况,最坏情况和平均情况。 您可以直接计算进行多少次比较,因为您的代码应该很短。

您正在考虑的中位数技术是针对更普遍的情况,即您拥有任意数量的元素,并希望采用所有元素的中值。 肯定比这复杂,但这似乎并不是您要执行的操作。

希望这可以帮助!

暗示:

如果a <= b并且b <= c,则b是中位数。

如果a <= b且b> c且c> = a,则c为中位数。

如果a <= b且b> c且c <a,则a为中位数。

如果a> = b并且b> = c,则b是中位数。

如果a> = b且b <c和a> = c,则c为中位数。

如果a> = b且b <c和a <c,则a是中位数。

您可以在嵌套的if / else语句中对此进行编码,以便在返回答案之前执行2或3个比较。 唯一的问题是比较次数最坏的情况,最好的情况和平均情况。 对于平均情况,您可能必须假设所有3个数字都是不同的(但以随机顺序),否则“等于”情况可以根据比较的频繁程度更改比较的平均次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM