WikiDer > Кривая Гильберта
В Кривая Гильберта (также известный как Кривая заполнения гильбертова пространства) это непрерывный фрактал кривая заполнения пространства впервые описан немецким математиком Дэвид Гильберт в 1891 г.,[1] как вариант заполнения пространства Кривые Пеано обнаружен Джузеппе Пеано в 1890 г.[2]
Поскольку он заполняет пространство, его Хаусдорфово измерение равно 2 (точнее, его образ - это единичный квадрат, размерность которого равна 2 в любом определении размерности; его график - компакт, гомеоморфный замкнутому единичному интервалу, с размерностью Хаусдорфа 2).
Кривая Гильберта строится как предел кусочно-линейные кривые. Длина -я кривая , т.е. длина растет экспоненциально с увеличением , даже если каждая кривая содержится в квадрате с площадью .
Изображений
Вариант, первые три итерации[3]
Приложения и алгоритмы отображения
Как истинная кривая Гильберта, так и ее дискретные приближения полезны, потому что они дают отображение между одномерным и двумерным пространством, которое довольно хорошо сохраняет локальность.[4] Это означает, что две точки данных, которые расположены близко друг к другу в одномерном пространстве, также будут близки друг к другу после сворачивания. Обратное не всегда может быть правдой.
Благодаря этому свойству локальности кривая Гильберта широко используется в информатике. Например, диапазон IP-адреса используемые компьютерами, могут быть отображены в изображение с помощью кривой Гильберта. Код для создания изображения будет преобразовывать из 2D в 1D, чтобы найти цвет каждого пикселя, и иногда используется кривая Гильберта, потому что она удерживает ближайшие IP-адреса рядом друг с другом на изображении.
А оттенки серого фотографию можно преобразовать в смущенный черно-белое изображение с использованием пороговой обработки, при этом остаток от каждого пикселя добавляется к следующему пикселю по кривой Гильберта. Код для этого будет отображать из 1D в 2D, и иногда используется кривая Гильберта, потому что она не создает отвлекающих шаблонов, которые были бы видны глазу, если бы порядок был просто слева направо по каждой строке пикселей. Кривые Гильберта в высших измерениях являются примером обобщения Коды Грея, и иногда используются для аналогичных целей по тем же причинам. Для многомерных баз данных было предложено использовать порядок Гильберта вместо Z порядок потому что он лучше сохраняет местность. Например, кривые Гильберта использовались для сжатия и ускорения R-дерево индексы[5] (видеть R-дерево Гильберта). Они также использовались для сжатия хранилищ данных.[6][7]
Учитывая разнообразие приложений, полезно иметь алгоритмы для отображения в обоих направлениях. Во многих языках это лучше, если реализовывать итерацию, а не рекурсию. Следующее C код выполняет сопоставления в обоих направлениях, используя итерационные и битовые операции, а не рекурсию. Предполагается, что квадрат разделен на п к п клетки, для п степень двойки с целыми координатами, с (0,0) в нижнем левом углу, (п − 1, п - 1) в правом верхнем углу, а расстояние d который начинается с 0 в нижнем левом углу и продолжается до в правом нижнем углу. Это отличается от показанной выше анимации, где кривая начинается с верхнего левого угла и заканчивается в верхнем правом углу.
// конвертируем (x, y) в dint xy2d (int п, int Икс, int у) { int rx, ry, s, d=0; за (s=п/2; s>0; s/=2) { rx = (Икс & s) > 0; ry = (у & s) > 0; d += s * s * ((3 * rx) ^ ry); гнить(п, &Икс, &у, rx, ry); } возвращаться d;}// конвертируем d в (x, y)пустота d2xy(int п, int d, int *Икс, int *у) { int rx, ry, s, т=d; *Икс = *у = 0; за (s=1; s<п; s*=2) { rx = 1 & (т/2); ry = 1 & (т ^ rx); гнить(s, Икс, у, rx, ry); *Икс += s * rx; *у += s * ry; т /= 4; }}// вращать / переворачивать квадрант соответствующим образомпустота гнить(int п, int *Икс, int *у, int rx, int ry) { если (ry == 0) { если (rx == 1) { *Икс = п-1 - *Икс; *у = п-1 - *у; } // Меняем местами x и y int т = *Икс; *Икс = *у; *у = т; }}
В них используются соглашения C: символ & - это побитовое И, символ ^ - побитовое исключающее ИЛИ, оператор + = добавляет к переменной, а оператор / = делит переменную. Обработка логических значений в C означает, что в xy2d переменная rx установлен в 0 или 1 для соответствия биту s из Икс, и аналогично для ry.
Функция xy2d работает сверху вниз, начиная со старших битов Икс и у, и создание наиболее значимых битов d первый. Функция d2xy работает в обратном порядке, начиная с младших битов d, и наращивание Икс и у начиная с младших битов. Обе функции используют функцию вращения для поворота и отражения (Икс,у) систему координат соответствующим образом.
Два алгоритма сопоставления работают одинаково. Весь квадрат рассматривается как состоящий из 4-х областей, расположенных 2 на 2. Каждая область состоит из 4-х меньших областей и т. Д. Для нескольких уровней. На уровне s, каждый регион s к s клетки. Есть единственный цикл FOR, который проходит по уровням. На каждой итерации сумма добавляется к d или чтобы Икс и у, определяется тем, в каком из 4 регионов он находится на текущем уровне. Текущий регион из 4 (rx,ry), куда rx и ry равны 0 или 1. Таким образом, он потребляет 2 входных бита (либо 2 из d или по 1 из Икс и у) и генерирует два выходных бита. Он также вызывает функцию вращения, чтобы (Икс,у) будет подходящим для следующего уровня, на следующей итерации. Для xy2d он начинается с верхнего уровня всего квадрата и продвигается вниз до самого нижнего уровня отдельных ячеек. Для d2xy он начинается снизу с ячеек и включает весь квадрат.
Можно эффективно реализовать кривые Гильберта, даже если пространство данных не образует квадрат.[8] Более того, существует несколько возможных обобщений кривых Гильберта на более высокие измерения.[9][10]
Представление как система Линденмайера
Кривая Гильберта может быть выражена переписать систему (L-система).
- Алфавит : А, Б
- Константы : F + -
- Аксиома : А
- Правила производства:
- А → + BF − AFA − FB +
- B → −AF + BFB + FA−
Здесь «F» означает «тянуть вперед», «+» означает «повернуть налево на 90 °», «-» означает «повернуть направо на 90 °» (см. черепаха графика), а «A» и «B» игнорируются во время рисования.
Другие реализации
Графика Gems II[11] обсуждает когерентность кривой Гильберта и предоставляет реализацию.
Кривая Гильберта обычно используется среди рендеринг изображения или видео. Общие программы, такие как Блендер и Cinema 4D используйте кривую Гильберта, чтобы отслеживать объекты и визуализировать сцену.
Смотрите также
Викискладе есть медиафайлы по теме Кривая Гильберта. |
- Планирование кривой Гильберта
- R-дерево Гильберта
- Местоположение ссылки
- Хеширование с учетом местоположения
- Кривая Мура
- Многоугольник Мюррея
- Кривая Серпинского
- Список фракталов по размерности Хаусдорфа
Примечания
- ^ Д. Гильберт: Über die stetige Abbildung einer Linie auf ein Flächenstück. Mathematische Annalen 38 (1891), 459–460.
- ^ Г.Пеано: Sur une Courbe, qui remplit toute une aire plane. Mathematische Annalen 36 (1890), 157–160.
- ^ Бурж, Паскаль. "Глава 1: фракталы", Фракталы и хаос. Дата обращения: 9 февраля 2019 г.
- ^ Луна, В .; Jagadish, H.V .; Faloutsos, C .; Зальц, Дж. (2001), "Анализ свойств кластеризации кривой заполнения гильбертова пространства", IEEE Transactions по разработке знаний и данных, 13 (1): 124–141, CiteSeerX 10.1.1.552.6697, Дои:10.1109/69.908985.
- ^ И. Камель, К. Фалаутсос, R-дерево Гильберта: улучшенное R-дерево с использованием фракталов, в: Труды 20-й Международной конференции по очень большим базам данных, Morgan Kaufmann Publishers Inc., Сан-Франциско, Калифорния, США, 1994, С. 500–509.
- ^ Eavis, T .; Куева, Д. (2007). Архитектура сжатия гильбертова пространства для сред хранилищ данных. Конспект лекций по информатике. 4654. С. 1–12. Дои:10.1007/978-3-540-74553-2_1. ISBN 978-3-540-74552-5.
- ^ Лемир, Даниэль; Касер, Оуэн (2011). «Изменение порядка столбцов для меньших индексов». Информационные науки. 181 (12): 2550–2570. arXiv:0909.1346. Дои:10.1016 / j.ins.2011.02.002. S2CID 15253857.
- ^ Hamilton, C.H .; Рау-Чаплин А. (2007). «Компактные индексы Гильберта: кривые, заполняющие пространство для областей с неравными длинами сторон». Письма об обработке информации. 105 (5): 155–163. Дои:10.1016 / j.ipl.2007.08.034.
- ^ Alber, J .; Нидермайер, Р. (2000). «О многомерных кривых со свойством Гильберта». Теория вычислительных систем. 33 (4): 295–312. CiteSeerX 10.1.1.7.2039. Дои:10.1007 / s002240010003. S2CID 788382.
- ^ Х. Дж. Хаверкорт, Ф. ван Вальдервен, Четырехмерные кривые Гильберта для R-деревьев, в: Труды одиннадцатого семинара по разработке алгоритмов и экспериментам, 2009, стр. 63–73.
- ^ Вурхис, Дуглас: кривые, заполняющие пространство, и мера когерентности, стр. 26–30, Graphics Gems II.
дальнейшее чтение
- Уоррен-младший, Генри С. (2013). Хакерское наслаждение (2-е изд.). Эддисон Уэсли – Pearson Education, Inc. ISBN 978-0-321-84268-8.
- Маккенна, Дуглас М. (2019). Кривые Гильберта: вовнутрь и вовнутрь. Mathemaesthetics, Inc. ISBN 978-1-7332188-0-1.
внешняя ссылка
- Динамическая кривая Гильберта с JSXGraph
- Демонстрация трехмерной кривой Гильберта Three.js WebGL
- Мультфильм XKCD, использующий свойства локальности кривой Гильберта для создания «карты Интернета»
- Генератор Gcode для кривой Гильберта
- Итерационный алгоритм рисования кривой Гильберта в JavaScript
- Алгоритм 781: создание кривой заполнения пространства Гильберта с помощью рекурсии (цифровая библиотека ACM)