工作中需要將表中重複數據只留一條,其餘刪掉,第一想法就是用SQL去執行,
但是由於數據有幾十萬條,SQL的效率十分低下,於是寫個程序去執行,
也方便看到執行的進度,我是這樣做的:
先把表中所有數據的id查出來存進一個ArrayList中(list1),
再將不重複的記錄id查出來存進另一個ArrayList(list2),
再將重複數據的最小id查出來存進第三個ArrayList中(list3),
然後開始做差集:
list1.removeAll(list2);
list1.removeAll(list3);
跑起來問題就來了,超慢,查了下原因:
ArrayList 它的時間複雜度最差情況就是O(n*n*m)。
n是list1大小,m是list2大小,那我的天,計算了下我的複雜度有80千兆,難怪這麼慢,
於是按照查到的方法將list1類型改爲LinkedList,將list2,list3類型改爲HashSet,
果然,跑起來一會兒差集就完成了,LinkedList 它的時間複雜度最差情況是O(n*m),
那最差也就千萬級的複雜度,小多了,並且LinkedList對於刪除操作比ArrayList快多了,
HashSet對於查找比較快,誒,大學那些課都白學了,不說了,先哭會兒