顯示廣告
隱藏 ✕
看板 TL
作者 TL (踢欸樓)
標題 [筆記] 大量數字的計數並排序
時間 2013年01月27日 Sun. PM 06:38:15


看板 C_and_CPP
作者 iamlouis (2塊錢立頓紅茶包)
標題 Re: [問題] 大量數字的計數並排序
時間 Mon Dec 27 08:06:09 2010


※ 引述《mself (mself)》之銘言:
: 程式碼(Code): (請善用置底文標色功能)
: 我原本想用 map<int, int> 先計數,將結果存進檔案。
: 之後再用 sort command 排序那個檔案。
: 可是因為 input 太多了,跑出 std::bad_alloc 的錯誤
: 應該是記憶體不足。
: 請問要怎麼做比較好呢?

  我先假設你有 file system 可以用. 我想到的方法是將數值讀出來之後,
  取高位元的 16 bit 當作檔名, 把值放在該檔案當中. 例如: 值 0x11223344
  就會被放在 1122 這個檔案裡面, 所以最後這個檔案可能會長成這個樣子:

  1122:
    3344
    A487
    5566
    3344
    3345
    5566
    183c
    1ab0

  接下來, 把 1122 檔案內容做統計, 產生底下的檔案:

  1122.statistic:
    1122183c  1
    11221ab0  1
    11223344  2
    11223345  1
    11225566  2
    1122A487  1

  最後把所有的 .statistic 檔 cat 起來 (同一個檔案), 一起做一次 sort 就可以了.

  也就是說, 把 32-bit 值域先 hash 成小範圍的檔案們 (2^16個 16-bit 值域),
  讓統計或排序變簡單與可行, 最後再組合起來做一次排序.
  當然, 如果在產生 statistic 檔的時候先排序過,
  這樣最後一個動作就可以用 merge sort 來做, 效率會更好.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 221.169.204.127
ledia:!!1F 12/27 09:48
james732:好酷,這個有一點MapReduce的味道 XDD2F 12/27 10:05
loveme00835:0.03F 12/27 10:06
bleed1979:覺得檔案內先排序是必要的。4F 12/27 10:10
bleed1979:不過動到IO的排序方式,一個下午不曉得能否跑完?
VictorTom:推一下:)6F 12/27 10:57
nowar100: 推一下:)7F 12/27 11:21

--
Shaken, Not Stirred.
--
※ 作者: TL 時間: 2013-01-27 18:38:15
※ 看板: TL 文章推薦值: 0 目前人氣: 0 累積人氣: 35 
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇