2013-08-03 6 views
0

Я ищу лучшую структуру данных для следующего случая: В моем случае у меня будет тысячи строк, однако для этого примера я буду использовать два по понятным причинам. Итак, скажем, у меня есть строки «Вода» и «Уолтер», мне нужно, чтобы в букву «W» вводились обе строки, которые нужно найти, и когда «Wat» вводится «Water», чтобы быть единственным результатом. Я сделал исследование, но я все еще не совсем уверен, какая правильная структура данных для этого случая, и я не хочу ее реализовывать, если не уверен, что это будет тратить время. Так что в основном то, что я сейчас думаю, это либо «Trie», либо «Suffix Tree». Похоже, что «Trie» будет делать трюк, но, как я сказал, мне нужно быть уверенным. Кроме того, реализация не должна быть проблемой, поэтому мне просто нужно знать правильную структуру. Также не стесняйтесь сообщать мне, есть ли лучший выбор. Как вы можете догадаться, нормальные структуры, такие как Dictionary/MultiDictionary, не будут работать, так как это будет убийца памяти. Я также планирую реализовать кеш, чтобы ограничить потребление памяти. Я сожалею, что нет кода, но я надеюсь, что я получу ответ. Заранее спасибо.Структура данных для поиска строк

+0

Похоже, вы хотите создать какую-то функцию автозаполнения. Я бы посмотрел, есть ли что-то уже существующее, которое вы могли бы использовать, вместо того, чтобы кататься самостоятельно. – Tim

+0

Планируете ли вы использовать дженерики? –

+0

Мое дело немного конкретное, и я не мог найти ничего, что сделает трюк. Это объяснение здесь очень мелкое. –

ответ

2

Вы должны связаться с пользователем Trie. Tries являются основой для одного из самых быстрых известных алгоритмов сортировки (burstsort), он также используется для проверки орфографии и используется в приложениях, которые используют завершение текста. Вы можете увидеть детали here.

+0

Спасибо, мой Trie отлично работает сейчас. –

1

Практически, если вы хотите сделать автоматическое предложение, то достаточно хранить до 3-4 символов. Я имею в виду предлагать, когда и когда пользователь вводит «a» или «ab» или «abc», и когда он набирает «abcd» или более символов, вы можете использовать map.keys, начинающиеся с «abcd», с использованием ладских выражений языка C#.

Таким образом, я предлагаю, создать карту, как: Карты < полукокса, < < Карты полукокса, Карта < полукокса, Set < строки >>>>> карты; Итак, если пользователь вводит «a», вы ищете карту [a] и найдете всех детей.

+0

Это кажется очень непрактичным и ограничивающим, мне нужно будет реализовать свою собственную структуру, потому что она должна работать с 3-4 классами (1 аннотация). –

+0

В принципе, если вы хотите реализовать в простой форме, то вы можете использовать конструкторы языка C#, такие как выражения lamda, для фильтрации данных на основе ваших потребностей, например:
map.keys.select (k => {return k.startsWith («user_input»);}
Не уверен в точном синтаксисе. – BVMR

+0

Лямбда-выражения медленны, так как они повторяют сбор, и я упомянул, что у меня будет тысячи записей. Что касается вашего сообщения => этот способ - это убийца памяти, изображение это с тысячами длинных строк, это была моя первая идея, но после некоторых вычислений она показала себя очень плохой идеей. –

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