英语不是我的母语:对我的错误感到抱歉。预先感谢您的回答。
我正在学习 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 给出的答案有效:
- 对集合进行排序,
- 使用std::set_intersection函数,
- 利润。
最佳答案
您需要计算两个集合中包含的元素数量。这称为集合交集,可以使用标准函数来完成 - set_intersection , header 算法的一部分。请记住,您仍然需要首先对两个数组进行排序。
关于c++ - 整数的双射映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25645829/