Структуры данных: что я должен использовать для этих условий? - PullRequest
6 голосов
/ 21 февраля 2010

Это не должно быть сложным вопросом, но я просто хотел бы, чтобы кто-то отскочил, прежде чем я продолжу. Мне просто нужно решить, какую структуру данных использовать на основе этих ожидаемых действий:

  1. Нужно будет часто перебирать в отсортированном порядке (начиная с заголовка).
  2. Потребуется удалить / восстановить произвольные элементы из отсортированного представления /.
  3. Позже я буду часто прибегать к данным и работать с несколькими отсортированными представлениями.
  4. Также позже я буду часто менять положение элементов в их отсортированных видах.

Кстати, на Яве.

Мое лучшее предположение заключается в том, что я либо буду запускать какой-либо собственный набор связанных хэшей (чтобы упорядочить ссылки в отсортированном порядке), либо, возможно, просто использую набор деревьев. Но я все еще не совсем уверен. Рекомендации?

Редактировать: Думаю, из-за произвольного удаления / восстановления, мне, вероятно, стоит придерживаться набора деревьев, верно?

На самом деле, не обязательно. Ммм ...

Ответы [ 2 ]

3 голосов
/ 21 февраля 2010

Теоретически, я бы сказал, что правильная структура данных - это многомерное дерево, предпочтительно что-то вроде дерева B +. Традиционно это дисковая структура данных, но современная основная память имеет много схожих характеристик из-за слоев кеша и виртуальной памяти.

Итерация по порядку дерева B + очень эффективна, потому что (1) вы перебираете только связанный список конечных узлов - узлы ветвления не нужны, и (2) вы получаете чрезвычайно хорошую локальность.

Поиск, удаление и вставка произвольных элементов - это log (n), как и для любого сбалансированного дерева, хотя и с различными постоянными коэффициентами.

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

НО - прагматически, это всего лишь то, что вы бы сделали, если уверены, что вам это нужно. Хорошие шансы, что вам лучше использовать какой-нибудь стандартный контейнер. Оптимизация алгоритма / структуры данных - лучший вид оптимизации, но он все еще может быть преждевременным.

3 голосов
/ 21 февраля 2010

Стандартный LinkedHashSet или LinkedMultiset из коллекций Google, если вы хотите, чтобы ваша структура данных сохраняла не уникальные значения.

...