Кривые заполнения пространства важны во многих графических приложениях, потому что они помогают раскрыть пространственную локализацию. Мы часто слышим о различных алгоритмах, использующих Z-кривые, коды Мортона, кривые Гильберта и т. Д. Каковы различия между некоторыми из этих разных кривых и как они применяются в различных приложениях?
14
Ответы:
Разница в том, насколько хорошо отображение сохраняет локальность и насколько легко кодировать / декодировать ключи. В статье Х. В. Джагадиша «Линейная кластеризация объектов с несколькими атрибутами» говорится: «Посредством алгебраического анализа и компьютерного моделирования мы показали, что в большинстве случаев отображение Гильберта работает так же хорошо, как и лучшее из альтернативных отображений, предложенных в литература". С другой стороны, z-порядок немного проще в использовании, например, сравните различные методы, перечисленные в Bit Twiddling Hacks для z-порядка и Википедии. для Гильбертова.
Что касается приложений, я думаю, что основным преимуществом использования кривых заполнения пространства является то, что они отображают точки из пространства более высокого измерения в пространство более низкого измерения. Например, они делают возможным оконный запрос точек с использованием традиционного индекса базы данных B-дерева. Опять же, с другой стороны, недостатком является то, что нужно заранее знать границы входных данных, так как позже трудно «изменить размер» отображения.
PS: «Z-кривая» - это то же самое, что и «код Мортона».
PPS: Дополнительные отображения включают кривую Пеано и для приложений см. Также Geohash .
источник
Эти кривые заполнения пространства позволяют сохранять локальность в нескольких измерениях, когда вы «гуляете» по кривой.
Из того, что я видел, Z-порядок (также известный как код Мортона) является наиболее используемым из-за его вычислительной стоимости, которая является постоянной (и дешевой) для прямого доступа к любой точке кривой. (И легко реализовать в оборудовании с нулевым штрафом за цикл, так как это соответствует «просто переключению» адресных проводов).
Конкретным примером кривой Z-порядка является перестановка текстур, которая в основном увеличивает частоту обращений к кешу для чтения текстур на графических процессорах. (См. Изображения в статье о Z-кривой, https://en.wikipedia.org/wiki/Z-order_curve )
Если текстура просто хранится линейно, вы получите максимальное попадание в кэш, если вы визуализируете только текстуру как 2D-изображение, но если вы повернете ее на 90 градусов на экране, вы попадете в худший вариант (потеря кэша для каждого чтения текстуры) ,
В результате, лучше немного пойти на компромисс и понизить свой лучший сценарий, а также получить лучший кэш для большинства шаблонов.
Как личное замечание, из того, что я видел, другие кривые могут потребовать рекурсивного шага для их вычисления и привести к большей стоимости, чем Z-кривая с минимальным выигрышем в терминах когерентности локальности. Итак, я не слышал об этих кривых, используемых с практической целью, кроме как в качестве предмета исследования в математической или творческой / смешной визуализации.
источник