Какой объект данных Java использовать для сопоставления многомерного диапазона? - PullRequest
2 голосов
/ 12 октября 2011

Фон проекта: Я пишу класс наложения листов карты для Java, который может использовать плитки gdal2tile.py.В основном я получу тысячи jpg-файлов, которые имеют структуру файла, такую ​​как «Уровень масштабирования / Координата X / Координата Y». Координаты - это целые числа, но не обязательно начинаются с 0 или 1. Мне нужно будет искать плитки, которыев определенном диапазоне, чтобы выяснить, какие из них мне нужно визуализировать.

Моя проблема: Я пытался выполнять итерации, используя саму файловую структуру, но она медленная (не удивительно).Я попытался выполнить итерацию, используя ArrayList строк структуры файла и .contains (), но это кажется еще медленнее (не слишком удивительно).Оптимально я хотел бы использовать структуру данных, которая позволила бы мне выбрать диапазон по нескольким измерениям, чтобы я мог вызвать что-то вроде.

Tiles.getWhere (Уровень масштабирования, мин. X, макс. X, мин. Y, макс. Y);

Я предполагаю, что какой-то вид Collection или TreeMap был бы правильным выбором, но я не достаточно опытен с Java, чтобы знать наверняка, и я предпочел бы не тестировать множество различных подходов.

Я мог бы использовать SQLite для этого, но это кажется излишним.

Мой вопрос: Какой самый эффективный способ проверить наличие наборов данных с учетом многомерных ограничений

Ответы [ 3 ]

0 голосов
/ 19 октября 2011

Звучит так, будто вы ищете что-то вроде дерева интервалов.

http://en.wikipedia.org/wiki/Interval_tree

Я реализовал один из них в прошлом, но только в одном измерении. В справочнике Википедии упоминаются расширения для большего количества измерений.

Пол

0 голосов
/ 19 октября 2011

Может быть, вы ищете карту с несколькими ключами.

Commons-collection предоставляет карту с несколькими ключами поиска:

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/map/MultiKeyMap.html

карта гарантирует O (1) вставку и O (1) выбор времени.

0 голосов
/ 17 октября 2011

Думая о вашей проблеме, я мог бы найти три направления, на которые вы могли бы нацелить свой поиск далее (это не руководство от руки, а скорее готовое к открытию мозговое устройство для застрявшего ситуация, с которой вы столкнулись) :

1) Использование встроенных структур Java. Да, действительно, список - это худший случай метода поиска. A Map, как следует из названия, гораздо удобнее для карт. Это не только имя, но индексирование Map значительно меньше времени по сравнению с List. Вы можете представить свою карту в виде куба, где вы должны обрабатывать около половины точек внутри нее, если вы используете List и, вероятно, только ее узкий слой при поиске с помощью индексации карты. Есть величина разницы. Итак, мой ответ здесь: Map - ключевое слово в правильном направлении (, если вы хотите сделать это таким образом после прочтения моего ответа) .

2) Использование решения картографического сервера. Это, вероятно, слишком далеко от вашего подхода, но целые рамки созданы для решения вашего типа вопроса. Примером является GeoServer . У него есть готовое решение для всей проблемы. Это стабильное решение для большой проблемы, возможно, у вас в руках: показать карту пользователю из источника.

3) Придерживаясь используемой вами инфраструктуры GDAL, вы можете выбрать несколько другой py-файл, например gdal_proximity.py и - вау! - у вас есть возможность поиска в ваших руках! Этот конкретный ищет по центральной точке и расстоянию, но будет делать то, что вам нужно =)

Есть отправная точка, как бы я это сделал. Может ли это послужить чему-то?

...