【问题标题】:Sorting subset of indices according to some criteria根据某些标准对索引子集进行排序
【发布时间】:2019-09-27 15:50:02
【问题描述】:

考虑

  • 前 n 个自然数的向量,I, I=[0, 1, ...n-1], n
  • 另一个自然向量 S, S[i]
  • 具有 m 个元素的 I 的子集,J, 0

是否有一种有效的方式(在 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

【问题讨论】:

    标签: c++ algorithm sorting stl


    【解决方案1】:

    我的做法是在手写排序例程中使用 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多