2014-03-27 38 views
0

我必須從數據文件中找到set union的基數並設置兩個集合的交集。我創建了兩個數組(setA []和setB [])來存儲我的數據。 a和b分別是集合A和集合B中的元素數量。 setIntersection應該保持集合A和B之間的交集結果。但是我被困在如何找到並集和交集。C++設置交集和使用數組的聯合

int printIntersection(int setA[], int setB[], int setIntersection[], int a, int b, int k) 
{ 
int i = 0; 
int j = 0; 

while(i < a && j < b) 
{ 
    if(setA[i] < setB[j]) 
    { 
     i++; 
    } 

    else if(setA[i] > setB[j]) 
    { 
     j++; 
    } 

    else if (setA[i] == setB[j]) 
    { 
     setIntersection[k] = setA[i]; 
     i++; 
     j++; 
     k++; 
    } 
    cout<<"Cardinality of intersection is "<<k<<endl; 
} 

此代碼是爲了交集,但我沒有得到任何東西。我不知道從哪裏開始工會。任何人都可以幫助我與代碼謝謝! P.S我只允許使用數組和簡單的代碼算法。提前致謝!

+0

數組是排序的嗎? – brokenfoot

+0

假設setA和setB的數組是排序的,那麼你的代碼看起來沒問題。當然可能是你沒有發佈的代碼被破壞了。 –

+0

不,這些集合沒有排序。我從文件中提取數據並直接放入數組。 –

回答

2

std::set_union使用和std::set_intersection,例如

int *c = std::set_union(setA, setA + a, setB, setB + b, setC) 
int *c = std::set_intersection(setA, setA + a, setB, setB + b, setC) 

其中setC是一個足夠大小的輸出數組; c指向過去構建範圍的最後一個元素。

如果你想基數,c - setC是你的答案。

我會建議使用像std::vector爲代表,和迭代器,而不是陣列/指針/長度的算法調用。

假設輸入範圍已排序;輸出也是如此。

如果你想自己做,你會在上面的鏈接找到「可能的實現」。