【发布时间】:2015-05-26 09:34:42
【问题描述】:
我正在尝试找到一种O(n∙log(n)) 排序方法来同时对多个数组进行排序,以便多值数组中的元素将代表来自 4 个不同单值数组的元素,并且排序方法将对多值元素进行排序.
例如:
对于给定的 4 个单值数组 An、Bn、Cn 和 Dn,
我会设置一个新数组 Qn
这样Qᵢ = [ Aᵢ Bᵢ Cᵢ Dᵢ ].Qᵢ 可以在此过程中更改,以便Qᵢ = [ Aaᵢ Bbᵢ Ccᵢ Ddᵢ ]
其中aᵢ、bᵢ、cᵢ 和dᵢ 是索引列表
当然还有Qᵢ ≤ Qᵢ₊₁ = [ Aaᵢ₊₁ Bbᵢ₊₁ Ccᵢ₊₁ Ddᵢ₊₁ ]、Aaᵢ ≤ Aaᵢ₊₁、Bbᵢ ≤ Bbᵢ₊₁ 等等。
动机当然是使用 SIMD 指令来受益于这种结构来分别对 4 个数组进行排序。
我尝试使用 SIMD 比较器(例如_mm_cmplt_ps)和掩码交换(例如_mm_blendv_ps)
制作传统排序算法的修改版本(快速排序、堆排序、合并排序等)
但我总是遇到理论上决策树中似乎有O(n∙log(n)) 步骤的问题。
因此,决定是否设置枢轴(快速排序)或是否将父级与其其中一个子级交换(堆排序)
对于所有 4 个组件同时在一起是不正确的(因此,下一步 - 向右或向左 - 是不正确的)。
目前我只有 O(n²) 方法有效。
有什么想法吗?
【问题讨论】:
-
@PaulR n 被认为非常大(非常密集的网格的坐标)。我之前处理过这篇文章。它谈到了一般排序(SIMD 结构中的单个数组)
-
@PaulR,这看起来像是我需要阅读的一篇有趣的论文。谢谢!
标签: algorithm sorting time-complexity sse simd