2016-12-16 1 views
1

現在私が出力するこれらのアレイの交差をしようとしている長さC++ 0で長さの異なる複数のアレイの交差探し(N + M)複雑

int * arrs[5]; 
int arrs_length[5]; 
int arr0[] = {1, 5, 8}; 
int arr1[] = {1, 2, 3, 5, 7, 10, 11, 15}; 
int arr2[] = {1, 4, 5, 6}; 
int arr3[] = {1, 5, 9, 14, 16, 19}; 
int arr4[] = {1, 2, 4, 5, 6, 9, 9}; 
arrs[0] = arr0; 
arrs_length[0] = sizeof(arr0)/sizeof(int); 
arrs[1] = arr1; 
arrs_length[1] = sizeof(arr1)/sizeof(int); 
arrs[2] = arr2; 
arrs_length[2] = sizeof(arr2)/sizeof(int); 
arrs[3] = arr3; 
arrs_length[3] = sizeof(arr3)/sizeof(int); 
arrs[4] = arr4; 
arrs_length[4] = sizeof(arr4)/sizeof(int); 

を変えてアレイを複数注文しました。

いずれかの配列の値を使ってunordered_mapを作成し、count関数を使用してそれが存在するかどうかを確認することから始めます。私は1と5が並んでいないときに問題にぶつかりますが、ラインアップするとうまくいきます。

int intersect(int *arrs[], int arrs_length[], int *re_arr, int & re_size){ 
    unordered_map <int,int> myMap; 
    int j=0; 
    for (int i=0; i<arrs_length[0]; i++){ 
     myMap[arrs[0][i]]; 
    } 

どのようにして順序付けられていないマップを適切に検索し、複数の配列を一度に検索する方法を知ってもらえますか?

+0

「n」と「m」とは何ですか? – alexeykuzmin0

+0

[std :: set_intersection](http://en.cppreference.com/w/cpp/algorithm/set_intersection)が役に立ちます。 – Jarod42

+0

@ alexeykuzmin0 nはすべての配列の合計長さです。 – Fishingwest

答えて

1

あなたは順不同マップを維持し、次の操作を実行できます。

あなたは各アレイの空の順序なしのセットを作成することができます。グローバルマップの現在の要素に現在の要素が含まれていない場合は、それを反復して+1を追加して、その要素をセットに追加することができます。それが既にある場合は、無視してください。

すべての配列をチェックした後、マップの要素を配列の数に等しい値で印刷してください。

このソリューションは、入力のサイズが線形であるため、最適な時間の複雑さがあります。

関連する問題