对“平滑”2D阵列的条目进行排序的最快方法

时间:2010-04-01 00:11:19

标签: mergesort timsort

在平滑的2D数组中对值进行排序的最快方法是什么?

输入是一个小的过滤图像:

  • 约60 x 80像素
  • 单一频道
  • 单精度或双精度浮球
  • 行主存储,内存顺序
  • 值有混合符号
  • 分段“平滑”,区域大约10像素宽

输出是排序值的平坦(约4800值)数组,以及对原始数组进行排序的索引。

5 个答案:

答案 0 :(得分:3)

我希望Timsort赢得这个,因为它利用了数据中的“运行”。

Quicksort通常会很快,但是你有可能遇到最糟糕的情况。例如当给定已经排序的输入时,某些版本的快速短路是O(n ^ 2)。如果有人给你错误类型的渐变填充图像,这将不会非常友好......

这是一个有点疯狂的想法 - 你也可以尝试一个Z排序通道(Wikipedia link),它可以让你在两个维度中利用相邻的相似颜色。

答案 1 :(得分:1)

我从就地快速排序开始。浮点数比较在大多数处理器上都很快(当然比合并程序所需的分配快得多)。

答案 2 :(得分:1)

我在平面阵列上使用numpy的排序例程对一些图像进行了快速而肮脏的基准测试。这是几百个随机图像和几百个人脸图像的平均值。两者都是单精度。

On random images...
quicksort took 0.000153 seconds per image.
mergesort took 0.000170 seconds per image.
heapsort took 0.000241 seconds per image.
On real images...
quicksort took 0.000136 seconds per image.
mergesort took 0.000143 seconds per image.
heapsort took 0.000230 seconds per image.

所有算法似乎都受益于现有的部分排序,尤其是快速排序。 Numpy似乎没有排序列表合并功能,所以我无法尝试对行进行预排序,唉。

答案 3 :(得分:0)

有timsort,但我在几个地方看到它适用于比较慢的应用程序; numpy devs显然决定甚至不打算实施它:

http://mail.scipy.org/pipermail/scipy-dev/2009-May/011929.html

答案 4 :(得分:0)

可以单独合并输出行,然后合并排序的行。

这将至少利用2D阵列的一些特殊结构,即单调运行通常将在阵列的边缘处开始和停止的事实。它还暴露了另外两个级别的并行性。