2

英语不是我的母语:对不起我的错误。预先感谢您的回答。

我正在学习 C++,我正在尝试检查具有相同整数数量的两个集合在多大程度上是双射的。

例子 :

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,则这两个集合是双射的。简单的。

我的问题如下:我想计算集合之间的双射数量,而不仅仅是 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 之间的双射。

然后,我的问题是: 您是否知道一种在两个大小相等的集合之间映射元素并计算双射数的方法,无论整数的顺序如何?

解决了!

Ivaylo Strandjev 给出的答案有效:

  1. 对集合进行排序,
  2. 使用std::set_intersection函数,
  3. 利润。
4

1 回答 1

2

您需要计算两个集合中包含的元素数量。这称为集合交集,可以使用标准函数set_intersection来完成,它是标头算法的一部分。请记住,您仍然需要先对两个数组进行排序。

于 2014-09-03T13:55:53.070 回答