[英]Merge conjoint sets in C++
從unsigned int
矢量向量開始...
vector<vector<unsigned short int> > matrix;
vector<unsigned short int> row;
我想合並聯合集(即具有共同元素的向量)。
對於istance,作為輸入:
matrix[0] = {0, 1, 2}
matrix[1] = {1, 10}
matrix[3] = {9}
matrix[4] = {2, 8}
matrix[5] = {7}
作為輸出:
matrix[0] = {0, 1, 2, 10, 8} // it doesn't matter the order
matrix[1] = {9}
matrix[2] = {7}
哪個是這個問題最有效的解決方案? 最好的問候,Vi。
您可以減少此問題以查找無向圖的所有連接組件 。 頂點是矩陣行,邊緣是非零重疊。 Boost.Graph庫可以在O(V+E)
復雜度中計算它,其中V
是數字頂點(矩陣行), E
是邊數(重疊行數)。 如果您不喜歡對Boost的依賴,可以使用任何可用的算法來計算強連接組件。
還剩下的是計算此圖的邊列表表示,這取決於您是否能夠對矩陣行進行排序。 如果無法對矩陣行進行排序,則可以使用std::find_first_of
來檢測非零重疊(對於N
和M
元素的2個向量,其具有O(N * M)
復雜度)。 如果你可以對它們進行排序(以O(N lg N)
復雜度),你可以使用std::set_intersection
來測試重疊(只有O(N + M)
復雜度)。
Boost.Graph或您的算法的輸出是一組連接的組件,然后循環遍歷每個組件並將矩陣的各個重疊行追加或合並(使用std::copy
或std::merge
如果你需要他們排序)。
我建議你使用不相交的森林 。 對於每個集合,迭代地將數字添加到集合的第一個數字所屬的集合中。 完成后,只需打印每組中的所有數字。 實際上,實現並不是那么難,但性能將比已經提出的解決方案快得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.