[問題] 同時尋找最小和第二小的數字(修改過)

看板C_and_CPP (C/C++)作者 (atoi)時間16年前 (2010/04/09 00:12), 編輯推噓5(5016)
留言21則, 8人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 不好意思又來問問題 ㄟ就是呢 有個題目要找一堆數字當中第二小的數字 然後比較次數是 n + lgn(取上界) - 2 題目有個hint寫說同時也會找到最小的 但我想了一個應該是最多 n 次的方法 不過我不知道方法對不對, 或是錯很大, 想來問一下 就是一開始先兩兩一組比較, 每組得到小的數字後 再用這些小的數字在兩兩比較 (一直這樣下去...) 最後會得到兩個數字(假設叫x,y好了,且x<=y), 這時就停止, 但還要再比一次 就是看 x 一開始是兩兩一組時是從哪一組得來的, 假設該組的另一個數字是z 然後將y和z比較, 若y<z則最小和第二小分別為x和y,否則是x和z 而若x已經等於y那就不用再比最後一次 我舉個例子好了: 5 1 2 8 0 3 6 4 <-- 比較次數: 4 (1 5) (2 8) (0 3) (4 6) \ \ <-- 比較次數: 2 (1 2) (0 4) / <-- 比較次數: 1 (0 1) (1<3) <-- 比較次數: 1 答案: 0和1 total: 4+2+1+1=8 有畫斜線表示小的數字從一組哪來, 最後沿著斜線 找到最上層的數字就可以比較最後一次了 我是想說數字若夠小一定最後會留下來,太大的就直接不理會 但是最小的數字或許剛開始比較會忽略了另一個數字 所以再比最後一次 ㄟ...不知道這樣對不對, 有錯請指教, 謝謝了, 也感謝耐心的看完 喔我後來有想到了, 應該要沿著斜線然後每組的另一個數字"都比較" 這樣的話就會是n +lgn(取上界) - 2 了 也有順便google一下, 應該是這樣沒錯 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.134.150

04/09 00:26, , 1F
喔喔我錯了 不要理會我
04/09 00:26, 1F

04/09 00:31, , 2F
比較次數一定要跟它一樣嗎?還是可以用別種方法?
04/09 00:31, 2F

04/09 00:32, , 3F
原PO一定從來不用sscanf..
04/09 00:32, 3F

04/09 00:36, , 4F
ㄟ真沒有用過耶 hty你是說跟題目的一樣嗎 他是說最差情況下會
04/09 00:36, 4F

04/09 00:37, , 5F
是 n + lgn - 2
04/09 00:37, 5F

04/09 00:50, , 6F
直接創bool陣列,讀到的數字改true,最後從0開始掃
04/09 00:50, 6F

04/09 00:51, , 7F
掃到第二個true就是第二小的,這樣可以嗎?
04/09 00:51, 7F

04/09 01:08, , 8F
hty這不行吧 因為如果有小於0的數字或重複的 就不行了吧
04/09 01:08, 8F

04/09 01:12, , 9F
用兩個二維陣列,一個存負的,重複也OK
04/09 01:12, 9F

04/09 01:13, , 10F
如果1, 1, 2, 3這case, 答案是1, 1還是1, 2?_?
04/09 01:13, 10F

04/09 01:15, , 11F
話說, n + lgn(取上界) - 2 的Big O還是 O(n) ㄟ....orz
04/09 01:15, 11F

04/09 01:23, , 12F
n + lgn + 2想得出來, -2就想不太出來了....~_~
04/09 01:23, 12F

04/09 01:26, , 13F
+2的方法, Hint就是敗部復活; -2的就留給其他強者了Orz
04/09 01:26, 13F

04/09 01:28, , 14F
不過概念是有了, 實際上能不能把compare壓下來啊.(糟XD)
04/09 01:28, 14F

04/09 01:33, , 15F
印象中這是演算法裡的老問題吧?估狗second largest應該很多
04/09 01:33, 15F

04/09 01:35, , 16F
修正一下,應該搜second largest problem或number之類的
04/09 01:35, 16F
※ 編輯: atoi 來自: 61.217.224.144 (04/09 05:12)

04/09 06:53, , 17F
痾...我看不太懂這個問題
04/09 06:53, 17F

04/09 06:54, , 18F
不是one pass scan 就可以找出最大跟第二大嗎??
04/09 06:54, 18F

04/09 06:54, , 19F
喔喔...比較次數限定很嚴格
04/09 06:54, 19F

04/09 14:36, , 20F
推原 po 最後的方法(Y)
04/09 14:36, 20F

04/09 18:51, , 21F
你的作法就是Winner Tree的算法
04/09 18:51, 21F
文章代碼(AID): #1BlW1UYB (C_and_CPP)
文章代碼(AID): #1BlW1UYB (C_and_CPP)