Базовые данные - Как выполнить сложную случайную выборку - PullRequest
0 голосов
/ 26 января 2012

Это скорее общий запрос на проектирование с Core Data и способ его разработки, чтобы он был эффективным.

Мое приложение - игра в слова, с базой данных sqlite3, в которой содержится словарь слов в диапазоне от 2 до 28 букв. В базе данных есть столбцы для слов и размера слова.

Результат, который я хочу получить (и запрос, который я хотел бы разработать), состоит в том, чтобы выбрать 10 случайных слов каждого размера, то есть 10 случайных двухбуквенных слова, 10 случайных трехбуквенных слова и т. Д.

Кроме того, я пытаюсь выполнить эту загрузку заранее в AppDelegate во время загрузки моего приложения.

Я думал об этом несколькими способами, но мне действительно нужно ваше мнение:

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

  2. выборка случайных слов с использованием смещений в индексе, то есть 0 - 20 = 2 буквенных слова, 21 - 972 = 3 буквенных слова

  3. получить случайные, скажем, 500 записей, основанные на случайном индексе, и надеемся, что он содержит не менее 10 слов каждой длины.

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

Заранее спасибо. Pras.

Ответы [ 2 ]

0 голосов
/ 30 января 2012

Если ваш словарь относительно статичен, предварительно вычислите количество слов различной длины. Сохраните поле произвольного идентификатора для каждого слова, которое идентифицирует его как экземпляр I слов длины L. Например, слово «foo» может быть экземпляром 638 слов длины 3, «fop» будет 639 и т. Д.

Генерация случайных индексов из этих диапазонов (просто случайная выборка без замены чисел от 1 до I [max] для данного L), помещение их в NSSet и применение предиката с использованием этого набора.

Таким образом, вы извлекаете не все объекты, а только подмножество с одной выборкой. Расходы заключаются в том, чтобы изменить словарь, чтобы он содержал предварительно вычисленный индекс, и вы захотите где-нибудь отслеживать Imax, но если ваш словарь не сильно изменится, то вам придется выполнять индексирование только один раз (и добавление последующих слов дешевле).

0 голосов
/ 30 января 2012

Я думаю, что нашел свой собственный ответ через некоторое тестирование.

метод (1), очевидно, является простым способом, но слишком ресурсоемким для извлечения и хранения огромного количества данных.

Метод (3) просто глупо.

, поэтому я выбрал метод (2) с некоторыми недавно приобретенными навыками Core Data.

Этот метод выглядит следующим образом:

  1. Установите мой метод для запуска какфоновый поток
  2. Настройте NSFetchRequest, NSManagedObjectContext и NSEntityDescription стандартным способом.
  3. Примените мой предикат к запросу, например, все слова длины 2
  4. Получить счетчикзначения (используя countForFetchRequest :) с использованием предиката
  5. Произведите рандомизацию значения смещения (я знаю смещение для каждой длины (жестко запрограммировано), которое я затем добавляю к (значение arc4random% count) - убедившись, что мойзначение случайного смещения может вращаться при приближении к максимальному количеству, например, если count = 22, и случайное смещение = 21)
  6. Установить предел выборки для возврата небольшого числа результатов, например 10.
  7. Выполнить выборкуrequest
  8. Сохраните результаты

Хотя не является полностью случайным , приведенный выше метод является быстрым и возвращает 10 последовательных значений изслучайное смещение и сохраняет его в NSMutableArray.

Обновление : Фактический код и подробное объяснение можно найти на моей странице учебника: http://prasannaellanti.com/tutorials/

Любые другие предложения приветствуются.Pras.

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