2010-02-24 6 views
3

У меня есть карта высот (2D-массив значений с плавающей запятой), и я хочу найти самую высокую точку на карте, как только я нашел эту точку, я хочу изменить ее значение, а значения всех близлежащих точек. Какая лучшая структура данных используется для эффективного поиска наивысшей точки?Лучшая структура данных для карты высот

Требования:

  • Найти самую высокую точку эффективно
  • Измените значение произвольного набора точек, этот набор всегда будет содержать самую высокую точку тока и нагрузки точек поблизости, дельта будет быть разными для каждой точки.

Мое текущее мышление - это очередь приоритетов, я могу найти наивысшую точку в O (1), и я могу изменить нагрузку значений и heapify в O (n log n).

Nb. Я отметил это как язык-агностик и Lua, потому что это скорее агностический вопрос языка, но я буду реализовывать окончательное решение в Lua.

ответ

2

Если память не является большой проблемой, я бы сохранил каждое значение в очереди приоритетов в виде таблицы, чтобы каждая таблица имела свои значения данных и ссылки на своих ближайших соседей. Что-то вроде этого: {data = number, neighbors = {...}}.

+0

хмм, это звучит как интересный способ сделать что-то. Написание очереди приоритетов в Lua должно быть весело: D – Martin

+1

Это:) Я рекомендую сначала начать с версии на основе списка, а затем перейти к двоичной базе с кучей. Причина этого в том, что на основе списка намного быстрее реализовать, и, следовательно, вы знаете, был ли это правильный путь. Я рекомендую переопределить метаметоды сравнения объектов, чтобы в очереди приоритетов вы могли сравнивать их с операторами сравнения, поэтому очередь приоритетов может быть легко сделана общей. – ponzao

+0

У меня уже была min-max-heap, реализованная на C#, поэтому я портировал это, это невероятно быстро: D – Martin

0

Пока вы строите свою очередь приоритетов, я просто сканирую массив и возвращаю индексы самого высокого найденного значения. Затем я могу получить доступ к любому элементу массива «поблизости» в O (1).

Или я что-то упускаю?

+0

Как сканирование массива принимает O (1)? :/ – Martin

+0

Я не утверждал, что сканирование массива равно O (1). Но, учитывая индексы элемента массива, время доступа равно O (1). –

+0

Правда, но поиск индекса требует сканирования по всему массиву, что я и стараюсь избегать – Martin

Смежные вопросы