簡體   English   中英

在C ++中合並聯合集

[英]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來檢測非零重疊(對於NM元素的2個向量,其具有O(N * M)復雜度)。 如果你可以對它們進行排序(以O(N lg N)復雜度),你可以使用std::set_intersection來測試重疊(只有O(N + M)復雜度)。

Boost.Graph或您的算法的輸出是一組連接的組件,然后循環遍歷每個組件並將矩陣的各個重疊行追加或合並(使用std::copystd::merge如果你需要他們排序)。

我建議你使用不相交的森林 對於每個集合,迭代地將數字添加到集合的第一個數字所屬的集合中。 完成后,只需打印每組中的所有數字。 實際上,實現並不是那么難,但性能將比已經提出的解決方案快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM