2010-04-01 2 views
1

Каков самый быстрый способ сортировки значений в гладкой 2D-матрице?Самый быстрый способ сортировки записей «плавного» 2D-массива

Входной небольшой отфильтрованного изображения:

  • около 60 по 80 пикселей
  • одноканальные
  • одинарной или двойной точности с плавающей точкой
  • строки из основных хранения, последовательные в памяти
  • значения имеют смешанный знак
  • кусочно-гладкий, с областями порядка 10 пикселей в ширину

Выход - это плоское (около 4800 значений) массив отсортированных значений, а также индексы, сортирующие исходный массив.

+0

BTW, как вы делаете свою гладкую? Я использую двухпроходное гауссовское размытие (горизонтальное, затем вертикальное), но это довольно медленно, особенно на X360. –

+0

двухпроходное гауссовское размытие на исходных изображениях перед аффинной деформацией/повторной выборкой. фильтр использует пример синтаксической свертки CUDA, завернутый в pycuda, и собственное ядро ​​повторного выборки изображений, снова в pycuda. –

ответ

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 нет функции сортировки списка сортировки, поэтому я не могу попробовать предварительно отсортировать строки, увы.

0

Существует timsort, но я видел в нескольких местах, что он предназначен для приложений с медленными сравнениями; что Numpy разработчики, видимо, решили не беспокоить даже его реализации:

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

0

Можно слияние строк по отдельности, а затем объединить отсортированные строки.

Это, по крайней мере, будет использовать некоторую специальную структуру 2D-массива, то есть тот факт, что монотонные прогоны обычно начинаются и останавливаются на краю массива. Он также предоставляет еще пару уровней параллелизма.

1

Я бы начал с быстрой сортировки на месте. Сравнение с плавающей точкой выполняется на большинстве процессоров (конечно, намного быстрее, чем распределение, необходимое для объединения).

3

Я бы ожидал, что Timsort выиграет это, так как он использует преимущества «прогонов» в данных.

Quicksort обычно будет быстрым, но существует риск, что вы попадете в наихудший сценарий. например некоторые версии quickshort - это O (n^2), если заданы уже отсортированные данные. Который не был бы очень дружелюбным, если бы кто-то дал вам неправильный тип заполненного градиентом изображения ...

Вот немного сумасшедшая идея - вы также можете попробовать пропуск Z-порядка (Wikipedia link), который мог бы вам помочь чтобы использовать соседние аналогичные цвета в обоих измерениях.

+0

Z-ordering - это аккуратная идея ...Есть все еще «хорошие» и «плохие» направления, но я думаю, что во всех случаях это поможет улучшить глобальный порядок, даже если местный порядок может быть произвольным. Благодаря! –

+0

Нет проблем. Я обнаружил, что Z-порядок очень странно полезен во многих странных ситуациях, особенно когда речь идет о любых двухмерных данных. – mikera