c++ - 整数的双射映射

标签 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 双射。事实上,如果我们对数组进行排序,我们会得到:

数组A = 0, 0, 0, 1; 数组B = 0, 1, 3, 3。

并排比较仅显示 0 和 0 之间的双射。

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

解决了!

Ivaylo Strandjev 给出的答案有效:

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

最佳答案

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

关于c++ - 整数的双射映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25645829/

相关文章:

c++ - 不同类c++对象之间的通信

c++ - 在 O(min(log(n),log(m)) 复杂度中找到两个不同大小的排序数组的中位数

javascript - 从数字返回一个唯一且排序的字符串

java - 在 Java 中将字符串转换为可逆的内容

c++ - 在 C++ "No Matching Function"中对 vector 使用删除函数的问题

C++ 加密 ascii 值打印数组中的返回键

c++ - 调用基类的运算符...安全吗?

algorithm - Triple-CRC-32 对于生成非安全均匀分布哈希来说是一个坏(或不是)主意吗?

algorithm - 是否存在没有隐藏状态的 "good"PRNG 生成值?