2

英語は私の母国語ではありません。私の間違いで申し訳ありません。ご回答ありがとうございます。

私は C++ を学んでおり、同じ数の整数を持つ 2 つのセット (順序は問わない) がどの程度全単射であるかを確認しようとしています。

例 :

int ArrayA [4] = { 0, 0, 3, 4 };
int ArrayB [4] = { 4, 0, 0, 3 };

ArrayA と ArrayB は全単射です。

私の実装は素朴です。

int i, x=0;    
std::sort(std::begin(ArrayA), std::end(ArrayA));
std::sort(std::begin(ArrayB), std::end(ArrayB));
for (i=0; i<4; i++) if (ArrayA[i]!=ArrayB[i]) x++;

x == 0 の場合、2 つのセットは全単射です。簡単。

私の問題は次のとおりです。ArrayA と ArrayB の間の関係のプロパティ全体だけでなく、セット間の全単射の数を数えたいと思います。

例 :

int ArrayA [4] = { 0, 0, 0, 1 }
int ArrayB [4] = { 3, 1, 3, 0 }

集合は全体として全単射ですか? いいえ。しかし、2 つの全単射 (0 と 0、1 と 1) があります。

私のコードでは、出力は 1 バイジェクションになります。実際、配列をソートすると、次のようになります。

配列 A = 0、0、0、1; 配列 B = 0、1、3、3。

並べて比較すると、0 と 0 の間の全単射のみが示されます。

次に、私の質問は次 のとおりです。整数の順序に関係なく、同じサイズの 2 つのセット間で要素をマップし、全単射の数をカウントする方法を知っていますか?

解決しました!

Ivaylo Strandjev の答えは次のとおりです。

  1. セットを並べ替え、
  2. std::set_intersection関数を使用し、
  3. 利益。
4

1 に答える 1