2015-01-21 33 views
1

在這個項目中,有多個sets,其中它們保持1-9的值。在此範圍內,我需要有效地確定在一個set中是否有唯一的值,而不是其他值。確定多個集合中的唯一值

例如:

std::set<int> s_1 = { 1, 2, 3, 4, 5 }; 
std::set<int> s_2 = { 2, 3, 4 }; 
std::set<int> s_3 = { 2, 3, 4, 6 }; 

注:sets的數量是未知的,直到runtime

正如你所看到的,s_1包含15s_3包含6獨特價值的獨特價值。

確定的唯一值後,上述sets應該那麼只包含唯一值,如:

// s_1 { 1, 5 } 
// s_2 { 2, 3, 4 } 
// s_3 { 6 } 

我已經試過到目前爲止是loop通過所有的sets和記錄的count已出現的numbers。不過,我想知道是否有更有效的解決方案。

+1

我不認爲有比檢查所有集合中的每個數字更有效的解決方案。如果您是從s_1開始的,那麼不應該將2,3和4放在s_1而不是s_2中? – 2015-01-21 08:47:21

+0

2,3和4都是集合,不應該出現在最後沒有集合(即不應該設置爲空)? – 2015-01-21 08:50:03

+0

所有的'sets'都是相互獨立地獲取他們的數據,但爲了這個程序的目的,我想在獲得數據後從包含唯一值的集合中挑出非唯一值。 – Hayden 2015-01-21 08:50:32

回答

0

std C++庫中有std算法,用於2組的交集,差異和聯合運算。

如果我理解得很清楚你的問題你可以做到這一點: 做所有集合(在一個循環中)的交集來確定一個基數,然後應用每個集合和基數之間的差異? 您可以根據當前的實施情況對其進行基準測試。應該更快。

看看這個答案。

Getting Union, Intersection, or Difference of Sets in C++

編輯:CF託尼D.評論:您可以基本上做到使用std::bitset<>和二元運算相同的操作(& |等),這應該會更快。 根據您的輸入的實際大小,可能是值得一試。

+0

我打算接受這個答案,因爲這裏有很好的信息。 – Hayden 2015-01-21 09:07:07

+0

@Hayen - 我會告訴你的解決方案更好。使用std :: set_ *函數 - 使代碼看起來很差,很難閱讀。試着用這些方法寫A - A ^(B u C),你可能更喜歡你自己的答案。 – Kiran 2015-01-21 09:09:24

0

我建議在C#這樣的事情

Dictionary<int, int> result = new Dictionary<int, int>(); 
foreach(int i in sets){ 
    if(!result.containskey(i)) 
     result.add(i,1); 
    else 
     result[i].value = result[i].value+1; 
} 

現在的計數值顯示的數字僅1意味着它的唯一的,那麼找到這些數字套...

+0

這就是我基本上寫了我最初的解決方案。 – Hayden 2015-01-21 08:57:27

0

我建議:

  1. 開始將所有集合中的所有元素插入到多圖中。
  2. 這裏每個元素都是一個關鍵字,集合名稱是值。
  3. 一個你的多圖填充所有集合中的所有元素,然後循環遍歷多圖並獲取多圖中的每個元素的數量。
  4. 如果任何密鑰的計數爲1,則表示它的唯一值爲 ,這將是集合名稱。
相關問題