Проверьте, содержит ли NSString общее имя на iPhone - PullRequest
1 голос
/ 11 января 2011

Мне интересно, как лучше всего проверить, содержится ли общее имя в NSString в приложении для iPhone.У меня есть отсортированный текстовый файл с ~ 5500 распространенными американскими именами, разделенными новыми строками.Строка NSSt, в которой я ищу имя, не очень длинная, скорее всего, размером с нормальное предложение.

Мой первоначальный план состоял в том, чтобы загрузить отсортированный список в память и затем выполнить итерации по каждому слову в выполнении NSStringдвоичный поиск по списку, чтобы определить, было ли это слово общим именем.

Лучше ли мне попытаться поместить этот список имен в CoreData или таблицу SQLite и выполнить запрос с этим?Насколько я понимаю, мне не пришлось бы загружать весь список в память, если бы я пошел по этому пути.

Я предполагаю, что эта ситуация является общей проблемой со словарями слов для игр в слова, поэтому мне просто интересно, чтоЛучшая практика для быстрого поиска.Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 января 2011

NSSet также может быть полезен. Ответ Дейва Делонга на другой вопрос демонстрирует, что NSSets имеют постоянное время поиска, т.е. O (1).

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

После этого просто используйте [nameSet containsObject:name], чтобы проверить, находится ли он в списке.

Пара недостатков этого подхода:

  1. Имя, которое вы хотите проверить, должно совпадать с именем в наборе, то есть & ldquo; paul & rdquo; и & ldquo; Пол & rdquo; разные строки. Вы можете обойти это, преобразовав все имена в нижний регистр, прежде чем вставить их в набор, а затем также преобразовав имя, которое вы хотите проверить в нижний регистр, прежде чем сравнивать его с набором.
  2. Может быть, проще пойти с уже принятым ответом.
2 голосов
/ 11 января 2011

SQLite звучит идеально для этого с точки зрения скорости поиска и минимизации использования памяти. Это также сделало бы возможным обновление списка имен через Интернет, если это необходимо.

Использование Core Data (которое фактически является оберткой elabourate вокруг SQLite) в этом случае было бы излишним, особенно если вам не нужны возможности, подобные ORM.

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