英語は私の母国語ではありません。私の間違いで申し訳ありません。ご回答ありがとうございます。
私は 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 の答えは次のとおりです。
- セットを並べ替え、
- std::set_intersection関数を使用し、
- 利益。