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