看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《yauhh (喲)》之銘言: : ※ 引述《applea123 (小刀)》之銘言: : : 最近在寫眾數問題 : : 主要是考慮到眾數>2時 : : ex:1 1 1 1 1 2 2 2 2 3 3 3 4 4 : : 眾數有1 2 : : 次數4 : : 我自己是有寫出來 但是想問問大家有沒更快的"想法" : : 我的步驟: : : 1.排序 並丟入a[] : : 2.用一個陣列b[]紀錄各數出現次數並使用另一個對應陣列c[]來記錄此數字 : : 3.陣列b排列並且c一起做交換 : : 4.判斷b[] if(b[i]=b[i+1]) : : 5.印出b[] 與c[] : 我的作法沒很快,很基本: : 一直線掃描,看過的數字把頻次加一,沒看過的數字填入表中. 啊哈, 如果考慮的有界整數, 考慮 bucket sort 的變形就好 想法跟你一樣, 但如果知道上下界的話, 直接開一個固定大小的 array X, 假設是 0 - 99, 看到 0 就在 X[0] 加一, 線性時間內就解決了。 要找眾數就等同於找這個 array 上的最大值們。排序也可以順便完成, 照頻率表上的數字填回去就好。 -- XOO's http://xcycl.wordpress.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 147.188.193.87
yauhh:嗯!沒錯 10/22 09:07
loveme00835:把問題簡化成這樣當然好做, 多來幾個 INT_MAX, 然後數 10/22 12:11
loveme00835:字種類不多, 這樣的線性... 10/22 12:11
tomap41017:想了很久用兩個Map來轉 http://codepad.org/9rWLJfi4 10/23 00:23
loveme00835:如果是這個做法我會用 map + priority_queue 喔 XD 10/23 00:46
tomap41017:XD 10/23 00:49
tomap41017:速度的差別嗎? 10/23 00:50
loveme00835:heap & RB tree 的速度這情況下應該是沒差多少, 不過 10/23 01:15
loveme00835:我不確定 end() 回傳的迭代器是不是屬於Bidirectional 10/23 01:16
loveme00835:Iterator, 最好還是用 rbegin 會比較好, 我會選用 10/23 01:17
loveme00835:priority_queue 的原因是因為他的介面很簡單, 我只需 10/23 01:18
loveme00835:自訂比大小的方法, 就可以等著一直取最大的元素出來, 10/23 01:18
loveme00835:而不必去記從哪邊取, 或是作key-value互換的動作 10/23 01:19
tomap41017:我是覺得還要多寫比較方法以及紀錄眾數及次數是什麼 10/23 01:34
tomap41017:會比較麻煩一點,就直接用第二個map開工拉XD 10/23 01:35
loveme00835:記住次數就好了說@_@ 看個人喜好囉~ 10/23 01:36
tomap41017:map的iter是bidirectional沒錯,--是因為past the end 10/23 01:36
tomap41017:你也太快回文= = 10/23 01:36
loveme00835:不, pass the end 不是指他真的在最後一個元素之後, 10/23 01:37
loveme00835:那只是一個概念, 雖然在vector裡真的是如此, 但在list 10/23 01:38
loveme00835:中, 或是 istream_iterator 來講, 都有可能是一個特別 10/23 01:38
loveme00835:的數值, 像是 NULL, 頂多只能當作標兵, 而不能用它來 10/23 01:39
loveme00835:作往回移的效果 10/23 01:39
loveme00835:打錯字 pass → past 10/23 01:41
tomap41017:我知道她是一個概念,畢竟rb tree要說最後一個元素很怪 10/23 01:44
tomap41017:而回傳的是bidirectional iter便代表可以--囉! 10/23 01:45
tomap41017:在sgi stl的pre condition內有寫到 10/23 01:45
tomap41017:i is dereferenceable or past-the-end. There exists 10/23 01:45
tomap41017: a dereferenceable iterator j such that i == ++j. 10/23 01:46
loveme00835:如果回傳的是BidirectionalIterator, 就表示可以--, 10/23 01:48
loveme00835:那你知道 past the end 本來就違反 dereferencable 這 10/23 01:49
loveme00835:個操作嗎? 你上面那句話只是說明 pass the end 是 rea 10/23 01:50
loveme00835:chable 並沒有說 從 past the end 還可以回來 10/23 01:50
loveme00835:找到了, 規格書中 24.1.4 的 Table 75 的第一列寫到 10/23 02:10
loveme00835:--i 的情況, 當有一個 dereferencable 的迭代器 s, 使 10/23 02:12
loveme00835:得 r == ++s, 那 --r 就是合法的 10/23 02:13
tomap41017:規格書你是上網買嗎XD?iterator的用法就此打住吧 10/23 12:20