Предварительно заполненный Trie

Задний план:
Моя группа CSS360 пытается создать приложение для Android, которое будет включать функцию автоматического завершения поиска. Данные, которые мы будем искать, составляют около 7000 записей и будут храниться в базе данных SQLite на самом телефоне. Самый очевидный подход – сделать линейный поиск базы данных после каждого символа, который вводит пользователь, а затем вернуть список предложений, которые являются потенциальными алфавитными расширениями запроса пользователя. Однако, похоже, это было бы довольно неэффективно, и мы искали лучшие альтернативы. В одном из моих классов сегодня мой инструктор кратко обсудил структуру данных trie и упомянул, что он часто используется для хранения целых словарей. Записи в trie можно найти в логарифмическом времени (в отличие от линейного времени для обычного старого массива), поэтому это кажется отличным инструментом для нас! К сожалению, мы уже в waaaay над нашими головами в этом проекте, и никто из нас действительно не знает, как это осуществить. Все из нас, когда-либо закодированные на сегодняшний день, являются базовыми консольными приложениями, чтобы научить нас основам программирования. Мы все пытаемся изучить платформу Android через неделю, просмотрев видеоролики YouTube и отличающиеся материалами базы данных от одного парня в нашей группе, у которого есть какой-либо опыт SQL. Мы могли бы серьезно использовать некоторые указатели!

Вопросов:

  • При создании trie, возможно ли, чтобы вся структура была предварительно заполнена? IE: создать строку кода для каждого используемого узла, чтобы вся структура уже была в памяти при запуске программы? Мое мышление здесь заключается в том, что это избавит нас от накладных расходов, связанных с необходимостью регенерации всего trie из базы данных при каждом запуске программы. Если да, есть ли простой способ получить эти тысячи строк кода в нашей программе? IE: Какой-то скрипт, который преобразует файлы базы данных в гигантский текстовый файл java-команд, которые можно скопировать и вставить в Eclipse?
  • Будет ли значительная часть накладных расходов, если мы будем искать базу данных напрямую, а не использовать какой-то внутренний список или структуру данных? Должны ли мы копировать имена из базы данных и искать их внутри программы для нашей функции автозаполнения?
  • Если это слишком сложно для нас технически, и нам приходится прибегать к регулярному линейному поиску, будет ли заметно влиять производительность?
  • Наши текущие планы состоят в том, чтобы запускать функцию автозаполнения каждый раз, когда пользователь вводит символ, а затем ждет возвращения функции, прежде чем разрешить им продолжать вводить текст. Единственные программы, которые любой из нас написал до сих пор, синхронно работают так. Что нам нужно знать, чтобы сделать эту функцию асинхронно? Учитывая наши новички и требования, которые нам уже нужно встречать, это было бы слишком сложно для нас?

Sqlite должен иметь возможность эффективно выполнять эту функцию автозаполнения. Я бы рекомендовал использовать их внутренние индексы для повторного внедрения колеса. Если вам нужно сделать последнее, то sqlite, вероятно, не поможет вам после того, как вы выполнили эту работу.

Если вы хотите, чтобы поиск подстроки, то полный текстовый поиск , вероятно, лучший выбор.

Если вы хотите только завершить начало слова, то просто использовать их показатели ванили должны быть более чем достаточно. Если производительность является проблемой, просто подождите, пока они не наберут три символа перед выполнением запроса. Задайте лимит своих результатов для мгновенных ответов.

Intereting Posts
Android M + Retrofit + JSON: невозможно создать конструктор полей SQLite внезапно считает все не ошибкой Невозможно включить просмотр в <фрагмент> Статические методы против расширения класса android.app.Application? Dialog – указанный ребенок уже имеет родителя. Вы должны сначала вызвать removeView () родителя ребенка Ошибка при использовании Robolectric для тестирования ActionBarActivity Открыть экран настроек для активации метода ввода Значок GPS по-прежнему мигает после locationManager.removeUpdates () и путем установки locationManager в null Android-бесшовный аудио-контур Сделайте частичный снимок экрана на Android? Как указать пальцем на объектив камеры или нет в андроиде? Как согласовать разницу в соотношении сторон между размером предварительного просмотра камеры и размером изображения Резервное копирование данных хранилищем данных Google Cloud Vs google drive vs другое хранилище Вкладки SlidingTabLayout не доступны для кликов Как остановить атаку hack / DOS на веб-API