簡體   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