通过与输入进行比较来安排输出

Arranging output by comparing with inputs

本文关键字:输出 比较 输入      更新时间:2023-10-16

我有两个数据集,如下所示:

第1组:57.5276 55.3756 24.2798 54.5989

第2组:55.1118 55.004 24.824 57.1398

现在我想安排第二组,使其与第一组最接近(我的意思是57.1398 55.1118 24.824 55.004这个顺序(。 我怎样才能在C++做到这一点。

排列第二组,使其以与第一组相同的方式排序。

更具体地说,第一组从最大数(57.5276(到第二大数(55.3756(,再到第四大数到第三大数。

以相同的方式安排第二组。最大 (57.1398(, 第二大 (55.004(, 第四大 (24.824(, 第三大 (57.1398( 按此顺序排列。这将最大限度地减少同一索引的项目之间的平均差异。

以编程方式实现此目的的一种简单方法是对两个集合进行排序,然后找到第一个集合中每个数字的排序索引,并按相同的顺序排列第二个集合。

匹配的"最接近"应该指定得更好一点。例如,这可以是"最小平方误差"、"最小绝对误差"、"最大相关性",它们都会给出不同的结果。

根据"最接近"的含义,您可能需要遍历 set2 的所有排列,这将是昂贵的。如果你想使用"对两个集合进行排序"解决方案,那么在 c++ 中实现这一点同时保留第一组顺序的一种可能方法是在 set1 中创建一个索引向量,并根据 set1 中的值对其进行排序

std::vector<double> set1{{57.5276,55.3756,24.2798,54.5989}};
std::vector<size_t> set1index(set1.size());
std::iota(set1index.begin(), set1index.end(), 0);
std::sort(set1index.begin(), set1index.end(), [&](size_t a, size_t b){return set1[a] < set1[b];});

然后,您可以对 set2 进行排序,并使用索引使用 set2 的值重新创建 set1 的顺序。