[英]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.