Структура данных для хранения 2D точек, сгруппированных рядом с источником? - PullRequest
1 голос
/ 23 сентября 2011

Мне нужно использовать пространственную 2D-карту для моего приложения.Карта обычно содержит небольшое количество значений в (-200, -200) - (200, 200) прямоугольнике, большинство из них около (0, 0).
Я думал об использовании хэш-карты, но затем мне нужна хэш-функция.Я подумал о x * 200 + y, но для добавления (0, 0) и (1, 0) потребуется только 800 байтов только для хеш-таблицы, и в моем приложении проблема с памятью.
Карта неизменна после начальной настройки, поэтому время вставки не равноЭто правда, но доступ большой (около 600 в секунду) и целевой процессор не очень быстрый.
Каковы общие компромиссы между временем памяти и доступом между хэш-картой и обычной картой (я полагаю,RB-Tree в стл) на небольших площадях?Что такое хорошая хеш-функция для небольших областей?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Я думаю, что есть несколько вещей, которые мне нужно объяснить более подробно, чтобы ответить на ваш вопрос.

Для начала, существует сильное различие между хэш-функцией, которая обычно используется вПрограмма и количество сегментов, используемых в хэш-таблице.В большинстве реализаций хеш-функции хеш-функция представляет собой некоторое отображение объектов на целые числа.Затем хеш-таблица может свободно выбирать любое количество сегментов, которое она хочет, а затем отображать обратно из целых чисел в эти сегменты.Обычно это делается путем взятия хеш-кода, а затем его изменения по количеству сегментов.Это означает, что если вы хотите сохранить точки в хеш-таблице, вам не нужно беспокоиться о том, насколько велики значения, которые создает ваша хеш-функция.Например, если в хэш-таблице только три сегмента и вы создаете объекты с хэш-кодами 0 и 1 000 000 000, то первый объект хэшируется в нулевой сегмент, а второй объект - в 1 000 000 000% 3 = 1-й сегмент.Вам не понадобится 1 000 000 000 ведер.Следовательно, вам не нужно беспокоиться о выборе хеш-функции, такой как x * 200 + y, поскольку, если ваша хеш-таблица не реализована очень странно, вам не нужно беспокоиться об использовании пространства.

Если вы создаетехеш-таблицу таким образом, что вы будете вставлять только один раз, а затем тратить много времени на доступ, вам может понадобиться совершенные хеш-функции и совершенные хеш-таблицыЭто структуры данных, которые работают, пытаясь найти хеш-функцию для набора точек, которые вы сохраняете, чтобы никогда не возникало коллизий.Они занимают (ожидаемое) O (n) время для создания и могут выполнять поиск в наихудшем случае O (1).Если исключить накладные расходы при вычислении хеш-функции, это самый быстрый способ поиска точек в пространстве.

Если бы вы просто выбросили все в древовидную карту, как это делают большинство реализаций std::map,Вы должны быть в порядке.Максимум 400x400 = 160 000 точек, время, необходимое для поиска точки, составило бы около 160 000 ≈ 18 просмотров.Это вряд ли будет узким местом в любом приложении, хотя, если вам действительно нужна вся производительность, вы можете получить вышеупомянутую идеальную хеш-таблицу, вероятно, будет лучшим вариантом.

Однако оба эти решения работают, только еслиинтересующие вас запросы имеют вид "существует ли точка p в наборе или нет?"Если вы хотите выполнить более сложные геометрические запросы, такие как поиск ближайших соседей или найти все точки в ограничительной рамке, вы можете рассмотреть более сложные структуры данных, такие как kd tree , которая поддерживает очень быстро (O (log n)) поиск и быстрый поиск ближайшего соседа и диапазона.

Надеюсь, это поможет!

0 голосов
/ 23 сентября 2011

Немного смущен вашей терминологией.

Объекты "map" в стандартной библиотеке являются реализациями ассоциативных массивов (либо через хеш-таблицы, либо через деревья двоичного поиска).

Если выВыполняя двумерную пространственную обработку и намереваясь реализовать поисковую структуру, существует много выделенных объектов данных - например, quadtrees и kd деревья .

Редактировать: Для нескольких идейна реализациях, возможно, проверьте: https://stackoverflow.com/questions/1402014/kdtree-implementation-c.

Честно говоря - структуры данных не так сложны - я всегда катал свои собственные.

...