整数的双射映射

时间:2014-09-03 13:35:34

标签: c++ bijection

英语不是我的母语:抱歉我的错误。提前感谢您的回答。

我正在学习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个双射。实际上,如果我们对数组进行排序,我们得到:

ArrayA = 0,0,0,1; ArrayB = 0,1,3,3。

并排比较只显示0到0之间的双射。

然后,我的问题是: 你知道一种在两个大小相同的集合之间映射元素的方法,并计算两次整数的顺序吗?

解决!

Ivaylo Strandjev的回答是:

  1. 对集合进行排序
  2. 使用std::set_intersection功能
  3. 利润。

1 个答案:

答案 0 :(得分:2)

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