2014-09-11 4 views
1

Как видно из названия, у меня есть файл, содержащий словари (каждая по одной строке), отсортированные по А-Я, и я хотел бы получить все словари с помощью данный префикс. Проблема состоит в том, что файл содержит более одного сортированного пробега A-Z, каждый из которых представляет собой другой язык. Невозможно выполнить предварительную обработку файла данных, и поскольку вы не можете определить длину сортированного прогона, я не могу думать о лучшем способе, чем просто перемещаться по всему файлу и сравнивать на пробеге, который принимает O (n). Можно ли достичь O (logN) с помощью этого странно отсортированного файла?Каков наиболее эффективный способ извлечения строки из файла, содержащего несколько отсортированных прогонов

+0

Можете ли вы определить минимальную длину * отсортированного пробега? Если вы можете, то вы можете использовать это, чтобы пропустить, чтобы определить отсортированные прогоны, не глядя на большинство строк. – btilly

+0

@btilly Я не могу предположить ничего, потому что все, что у меня есть, это всего лишь файл данных, и дизайн должен терпеть что угодно. – r0dney

+0

Можете ли вы подсчитать количество символов в строке? (буквальная длина каждого словаря) – yasen

ответ

1

Ничего лучше, чем сканирование полного файла, возможно, если ни один индекс, ни изменение файла не разрешены, если пробежки неизвестного размера.

Однако, если начальное смещение каждого прогона известно, то полное сканирование файла необходимо выполнить только один раз, и двоичный поиск может быть использован в каждом разделе - для ~ O(k lg (n/k)) после построения индекса. Стартовые смещения тривиально доступны на время работы программы и могут быть сохранены в файле кеша по мере необходимости.

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

Если файл невелик и достаточная память, это также может быть возможностью сохранить все в структуре в памяти. Возможно, стоит также взглянуть на существующий магазин, такой как SQLite; хотя предварительная обработка не была осуществимой.

+0

Файл большой, поэтому сортировка в памяти не является вариантом. И да, было бы неплохо иметь смещение, но, к сожалению, у меня их нет. Возможно, полное сканирование неизбежно. – r0dney

+0

@ r0dney Полномасштабное сканирование необходимо выполнить только один раз, поэтому, если запрос имеет много раз в рамках одного и того же процесса (или создается файл кэша/индекса), то он определенно окупится. – user2864740

+0

Я думал об одном и том же, но просто продолжал задаваться вопросом, есть ли лучшее решение. – r0dney

0

Вы можете объединить списки k в 1 отсортированный список (k way merge), который является задачей o (n * lg (k)). После этого вы сможете выполнить команду o (log n).

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