Отображение N-мерного значения в точку на кривой Гильберта

Использовать функцию разделения

var result = "12,Apple,20".Split(',');
39
задан Alexander Gladysh 31 January 2009 в 18:14
поделиться

4 ответа

Мне не ясно, как это сделает то, что Вы хотите. Рассмотрите этот trival 3D случай:

001 ------ 101
 |\         |\
 | \        | \
 |  011 ------ 111
 |   |      |   |
 |   |      |   |
000 -|---- 100  |
  \  |       \  |
   \ |        \ |
    010 ------ 110

, который может быть "Hilbertized" следующим путем:

001 -----> 101
  \          \
   \          \
    011        111
     ^          |
     |          |
000  |     100  |
  \  |       \  |
   \ |        \ V
    010        110

в 1D порядок:

000 -> 010 -> 011 -> 001 -> 101 -> 111 -> 110 -> 100

Вот противный бит. Рассмотрите список пар и 1D расстояния ниже:

000 : 100 -> 7
010 : 110 -> 5
011 : 111 -> 3
001 : 101 -> 1

Во всех случаях, лево-и правые значения являются тем же 3D расстоянием друг от друга (+/-1 в первом положении), которые, кажется, подразумевают подобную "пространственную местность". Но линеаризуя любым выбором размерного упорядочивания (y, затем z, затем z, в вышеупомянутом примере) повреждения та местность.

Другой способ сказать это - то, что взятие начальной точки и упорядочивание остающихся точек их расстоянием от той начальной точки обеспечат существенно отличающиеся результаты. Взятие 000 как запуск, например:

1D ordering : distance    3D ordering : distance
----------------------    ----------------------
        010 : 1           001,010,100 : 1
                          011,101,110 : sqrt(2)
                              111     : sqrt(3)
        011 : 2
        001 : 3
        101 : 4
        111 : 5
        110 : 6
        100 : 7

Этот эффект растет экспоненциально с количеством размеров (предполагающий, что каждый размер имеет тот же "размер").

5
ответ дан joel.neely 1 February 2009 в 04:14
поделиться

Другая возможность состояла бы в том, чтобы создать kd-дерево на Ваших данных, и затем ко чтобы обход дерева для получения упорядочивания. Построение kd-дерева только требует, чтобы у Вас был хороший находящий средний алгоритм, которого существуют многие.

2
ответ дан Adam Rosenfield 1 February 2009 в 04:14
поделиться

, который я не вижу, как можно использовать Гильбертову кривую в одном размере.

, Если Вы интересуетесь отображением точек к более низкому размеру при сохранении расстояний (с минимальной ошибкой) затем, можно изучить "Многомерное Масштабирование" алгоритмы.

Моделируемый отжиг является одним подходом.

Редактирование: Спасибо за комментарий. Я вижу то, что Вы подразумевали под Гильбертовым подходом Кривой теперь. Однако это - тяжелая проблема, и данный N=100 и 10 миллионов точек данных, я не думаю, что любой подход будет сохранять местность хорошо и работать за разумное количество времени. Я не думаю, что kd-деревья будут работать здесь.

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

1
ответ дан Imran 1 February 2009 в 04:14
поделиться

Алгоритм отображения n-> 1 и 1-> n приведен здесь «Вычисление сопоставлений между одномерными и n-мерными значениями с использованием кривой заполнения гильбертова пространства» Дж. К. Лоудер

Если вы Google поищите «модуль SFC и наложение Kademlia», вы найдете группу, которая утверждает, что использует его как часть их система. Если вы посмотрите исходный код, вы, вероятно, сможете извлечь соответствующую функцию.

8
ответ дан 27 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: