關於集合並集優化

2022-04-11 20:36:55 字數 928 閱讀 5229

線上環境遇到跨庫 事物的問題,歷史資料 狀態不一致問題。由於分布式事物還不成熟,決定使用手動寫自動任務每天定時執行。大概思路是查詢庫1的資料,然後查詢庫2的資料,之後去差集後再更新資料2的資料。

寫完後,求差集 。剛開始使用了集合的removeall ,測試環境資料量幾千條沒什麼問題,但是考慮到線上有30多萬條資料,於是寫了個測試。發現使用removeall超級慢。經過跟蹤原始碼發現,removeall裡面使用了兩次contains函式,相當是使用了笛卡爾積的方式 30萬*30萬。 於是決定優化。

方式如下:

long starttime =system.currenttimemillis();

linkedlist

result = new linkedlist<>();

for (int i =0;i<300000;i++)

system.out.println("result size:" +result.size());

list

list1 = new arraylist<>();

for (int j = 10;j<301000;j++)

system.out.println("list1 size:" +list1.size());

hashset

hashset = new hashset<>(list1);

iterator

it =result.iterator();

while

(it.hasnext())

}system.out.println(result.size());

for(string str : result)

long endtime =system.currenttimemillis();

long time = endtime-starttime;

這樣基本是ms級的

演算法 合併集合(並查集)

假如有n個集合,要進行對集合的合併或者判斷兩個數是否在同乙個集合中就要用到並查集。int find x 我們用p x x來判斷當前節點是否為根節點。如果當前節點不是根節點,就進行遞推,繼續呼叫find x 直到找到根節點,之後會進行路徑壓縮,讓根節點的所有子節點都指向根節點。返回值是當前節點的根節點...

專案三 求集合並集

問題及 2015,煙台大學計算機與控制工程學院 完成日期 2015年9月17日 問題描述 假設有兩個集合 a 和 b 分別用兩個線性表 la 和 lb 表示,即線性表中的資料元素即為集合中的成員。設計演算法,用函式unionlist list la,list lb,list lc 函式實現該演算法,...

專案3 求集合並集

all right reserved.檔名稱 creat2.cpp 作 者 張延飛 完成日期 2017年9月17日 版 本 號 v1.9 問題描述 假設有兩個集合 a 和 b 分別用兩個線性表 la 和 lb 表示,即線性表中的資料元素即為 集合中的成員。設計演算法,用函式unionlist lis...