В чем разница между различными кривыми заполнения пространства?

14

Кривые заполнения пространства важны во многих графических приложениях, потому что они помогают раскрыть пространственную локализацию. Мы часто слышим о различных алгоритмах, использующих Z-кривые, коды Мортона, кривые Гильберта и т. Д. Каковы различия между некоторыми из этих разных кривых и как они применяются в различных приложениях?

ap_
источник
См. Также раздел 2.1.1.2 Основ Самет для многомерных и метрических структур данных .
15:00

Ответы:

13

Разница в том, насколько хорошо отображение сохраняет локальность и насколько легко кодировать / декодировать ключи. В статье Х. В. Джагадиша «Линейная кластеризация объектов с несколькими атрибутами» говорится: «Посредством алгебраического анализа и компьютерного моделирования мы показали, что в большинстве случаев отображение Гильберта работает так же хорошо, как и лучшее из альтернативных отображений, предложенных в литература". С другой стороны, z-порядок немного проще в использовании, например, сравните различные методы, перечисленные в Bit Twiddling Hacks для z-порядка и Википедии. для Гильбертова.

Что касается приложений, я думаю, что основным преимуществом использования кривых заполнения пространства является то, что они отображают точки из пространства более высокого измерения в пространство более низкого измерения. Например, они делают возможным оконный запрос точек с использованием традиционного индекса базы данных B-дерева. Опять же, с другой стороны, недостатком является то, что нужно заранее знать границы входных данных, так как позже трудно «изменить размер» отображения.

PS: «Z-кривая» - это то же самое, что и «код Мортона».

PPS: Дополнительные отображения включают кривую Пеано и для приложений см. Также Geohash .

Ecir Hana
источник
9

Эти кривые заполнения пространства позволяют сохранять локальность в нескольких измерениях, когда вы «гуляете» по кривой.

Из того, что я видел, Z-порядок (также известный как код Мортона) является наиболее используемым из-за его вычислительной стоимости, которая является постоянной (и дешевой) для прямого доступа к любой точке кривой. (И легко реализовать в оборудовании с нулевым штрафом за цикл, так как это соответствует «просто переключению» адресных проводов).

Конкретным примером кривой Z-порядка является перестановка текстур, которая в основном увеличивает частоту обращений к кешу для чтения текстур на графических процессорах. (См. Изображения в статье о Z-кривой, https://en.wikipedia.org/wiki/Z-order_curve )

Если текстура просто хранится линейно, вы получите максимальное попадание в кэш, если вы визуализируете только текстуру как 2D-изображение, но если вы повернете ее на 90 градусов на экране, вы попадете в худший вариант (потеря кэша для каждого чтения текстуры) ,

В результате, лучше немного пойти на компромисс и понизить свой лучший сценарий, а также получить лучший кэш для большинства шаблонов.

Как личное замечание, из того, что я видел, другие кривые могут потребовать рекурсивного шага для их вычисления и привести к большей стоимости, чем Z-кривая с минимальным выигрышем в терминах когерентности локальности. Итак, я не слышал об этих кривых, используемых с практической целью, кроме как в качестве предмета исследования в математической или творческой / смешной визуализации.

Romain Piquois
источник