實現group by最好的辦法?

在SQL和很多函數式的語言(ruby, python...)當中,都可以直接用group_by這樣一個方法(function, method,..). 但是, 如果今天一定要用C, Java, .... 從頭實現, 除了下面的這個思路, 還有沒有更好的?

* 【修改】:input 無序。

* 【修改】:請先不討論Hadoop, MapReduce, ...

Input: [ Key, Value ]

{ [ "A", 1 ], [ "B", 3 ], [ "C", 1 ], [ "A", 2 ], [ "A", 6 ], [ "B", 7 ] ... ... ... }

Output:

{ [ "A", [ 1, 2, 6 ] ], [ "B", [ 3, 7 ] ], [ "C" [ 1 ] ], ... ... }

Output;

for element in "input":

_____for temp in "input":

__________if ( temp.key == element.key )

_______________Output . getKey( element.key ) . addValue( temp.value );

__________end if

_____end for

end for

(以上只是粗略表達一個想法, 沒有仔細考慮細節)

----------------------------------------

* 非常感謝 @vczh 的回答, 排序; 其實我更想知道, 在不能排序下, 有沒有特別漂亮的方法。

* 非常感謝 @鍾穎cyanzhong 的回答, 解釋一下,不排序的原因在於盡量避免修改原數據。 完全同意, 在空間複雜度允許的情況下, 複製數據在排序。


原問題的解法是O(n^2)

@vczh的排序是O(n lg n)

@鍾穎cyanzhong和@歐陽佳偉用map也是O(n lg n)

簡單的分攤O(n)方法是把Input的索引按key分組寫進 hashtable&&>,然後遍歷。這帶來臨時的額外O(n)空間開銷。只儲存index的話不用複制所有數據,也不用修改原來的數據。


按key排序,然後掃描一遍就可以了。


應當hash的好嘛,排毛序啊


Map& 每次用Key取出List,為空的話new一個List加進去,否則直接加到List裡面

如果你需要List本身也是有序的,排序是避免不了的,排序不是一個演算法而是一個需求,不管你用任何一種方法最後實現了有序,這不也是排序么?


數據量多大,如果內存能解決的話,直接用:

1)記錄的value不重複,hash_map&&>

2)記錄的value可重複(來一個記錄一個),hash_map&&>

如果數據量很大的話,berkeleyDB硬碟級鍵值對(map),類似思路解決。


根本沒有最好辦法啊。。。

不管是hash, treemap 還是先sort或遍歷都只是各有各的優勢適用於不同的場景。

待續。。。


先hash 再sort


還是用TreeMap,掃一遍就可以了


推薦閱讀:

學習演算法與數據結構,有什麼比較好的mooc推薦么,還有比較好的書籍推薦?
如何看待Thomas Cormen所說看完《演算法導論》需要的時間 ?
如何通俗地解釋「置信區間」和「置信水平」?
「二叉樹可以解決什麼問題」?
數據結構公開課學伯克利的CS 61B好還是清華鄧俊輝的mooc公開課好呢?

TAG:演算法 | 演算法導論書籍 | 數據結構 | 演算法設計 | 演算法與數據結構 |