Структура данных таблицы для быстрого поиска с подстановочными знаками - PullRequest
0 голосов
/ 08 сентября 2010

Я храню относительно небольшое количество (возможно, в будущем будет больше), а затем ищу его, но это оказывается своего рода узким местом в моем проекте.

Для расширения у меня есть донесколько тысяч строк и несколько столбцов.Я хотел бы иметь возможность поиска с возможностью указать простое совпадение с сопоставлением всех подстановочных знаков для любого элемента.Все вставки могут иметь место при построении, в идеале дубликатов не должно быть, и количество запросов значительно перевешивает конструкцию таблицы.Мне также нужно иметь возможность сравнивать таблицы, чтобы увидеть, содержат ли они одни и те же элементы (различия между ними не нужны).Сохраненные объекты можно хэшировать, но не упорядочивать.Все это хранится в памяти.

Итак, изначально я начал с простого хэш-набора:

   Set<ArrayWrapper> data = new HashSet<ArrayWrapper>();

, где ArrayWrapper - простая оболочка для Object[].Это, очевидно, медленный поиск с подстановочными знаками, например, {new Integer(3), null, "Test", null}, где null означает совпадение с чем угодно.Я добавил индекс для наименьшего значения с подстановочными знаками, что помогает, но я чувствую, что может быть лучшее решение?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

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

1 голос
/ 08 сентября 2010

@ Джастин - основываясь на вашем ответе, я думаю, что это можно реализовать с помощью карты карт.@Molehill - Определено ли количество используемых ключей?или это переменная?

Если она определена (например, 3: Integer, String, String), вы можете сделать Map<Integer, Map<String, Map<String, Object>>>.Если в вашем поиске есть подстановочный знак, вам придется опросить весь набор записей или набор значений карты, на которой вы находитесь.Вы можете получить фантазию и написать абстракцию об этом, хотя.Я недавно сделал это для 2-х ключевой карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...