c++ - 根据某些标准对索引子集进行排序
问题描述
考虑
- 前 n 个自然数的向量,I, I=[0, 1, ...n-1], n<=32。
- 另一个自然向量,S,S[i]<=2000,对于任何 i=0..n-1,不一定是唯一的
- I 的子集,具有 m 个元素,J, 0 <= J[j] < n,对于任何 j=0...m-1
是否有一种有效的方法(在 CPU 周期/缓存友好性/内存方面)根据 S(J) 对 J 的元素进行排序?
首选使用标准算法的 C++ 代码。
例子:
I = [0, 1, 2, 3, 4]
S = [10, 50, 40, 20, 30]
J = [1, 3, 4]
S(J) = [50, 20, 30]
J sorted according to S(J) = [3, 4, 1]
我考虑过使用 std::multimap 来获得“免费”的排序,但 std::multimap 背后的机制(分配等)似乎很昂贵。
使用 std::pair 绑定 J 和 S(J) 将允许使用 std::sort。缺点是需要额外的内存和额外的循环来获得最终排序的 J。
我的做法是在手写排序例程中使用 S(J) 作为标准同时对 J 和 S(J) 进行排序。然而,在 2019 年写一个排序函数似乎很尴尬。
这是一个聪明的方法吗?是否可以利用 n<=32 的事实?
解决方案
我的做法是在手写排序例程中使用 S(J) 作为标准同时对 J 和 S(J) 进行排序。然而,在 2019 年写一个排序函数似乎很尴尬。
你在正确的轨道上,但你不需要编写自己的排序。您可以利用 lambda 来获得所需的自定义排序行为,同时仍std::sort
用于为您对数组进行排序。您要做的是获取提供给 lambda 的值并将它们用作索引S
并比较这些结果。那会给你这样的代码
int main()
{
int S[] = {10, 50, 40, 20, 30};
int J[] = {1, 3, 4};
std::sort(std::begin(J), std::end(J),[&S](auto lhs, auto rhs){ return S[lhs] < S[rhs]; });
for (auto e : J)
{
std::cout << e << " ";
}
}
哪个输出
3 4 1
推荐阅读
- bash - Bash 命令在脚本中不起作用,但在控制台中不起作用
- android - 具有 0dp 高度的 ConstraintLayout 内的 RecyclerView 不会调用适配器和支架
- postgresql - “psql”中的语法错误,命令未执行
- javascript - 设置 cookie.secure = true 时,express-session 不返回 cookie
- c++ - C++:如何从我自己的函数中的头文件调用一个函数(比如说 funA()),它的名字也是 funA()?
- python - 如何在 python 中使用不同的字典从 max 中获取密钥?
- sql - 如何获得与另一个日期字段相关的最快日期
- android - Android 和 AAB 格式(Android App Bundle):Google 说“
- python-3.x - pandas geodataframe to shapefile,修复日期时间错误
- css - TinyMCE - 自定义工具栏上的 CSS 样式菜单