2014-08-28 3 views
4

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

Я пытаюсь отобразить набор данных, каталог. В каталоге у меня есть отделы и люди. Я знаю, это звучит как пример учебника, выслушайте меня. Я обещаю, что это не домашнее задание. (Я могу предоставить скриншоты того, над чем я работаю.)

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

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

Мой общий процесс таков:

  1. Фильтр все элементы, которые соответствуют типу и строки поиска, если есть один. Для этого шага я использую NSPredicate:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %i AND searchableContents B[cd] %@", type, searchString]; 
    
    if (!searchString || searchString.length == 0) 
    { 
        predicate = [NSPredicate predicateWithFormat:@"type == %i", type]; 
    } 
    
    NSArray *array = [_directoryContents filteredArrayUsingPredicate:predicate]; 
    
  2. Сортировать результаты по алфавиту.

    array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
        return [((BRKDirectoryEntry *)obj1).comperableTitle compare:((BRKDirectoryEntry *)obj2).comperableTitle]; 
    }]; 
    
  3. Разбить результаты на меньшие массивы. Для производительности я пропущу этот шаг, если мы ищем, но он, похоже, не помогает.

    if(alphabetized) 
    { 
        array = [self _alphabetizedArrayFromPresortedArray:array]; 
    } 
    

Выполнение этого в общей сложности 950 записей плачевно.

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

Любые указатели или подсказки?

+2

Я все еще удивляюсь, как много людей спрашивают: «Я делаю XYZ, и это слишком медленно. Как я могу сделать это быстрее?» Как будто у других людей есть большой шанс. Есть метод швейцарской армии, который не может потерять. [* Пусть сама программа скажет вам ответ. *] (Http://stackoverflow.com/a/378024/23771) Вот [* короткий пример *] (http://stackoverflow.com/a/4299378/23771) (в python, но вы получите идею). –

+0

Просто маленький совет: использование предиката намного медленнее, чем быстрое перечисление, как показано здесь: https://www.objc.io/issues/7-foundation/collections/ (раздел ** Перечисление и обмен сообщениями более высокого порядка **) И я думаю, что вы можете упростить эту строку кода если (! SearchString || searchString.length == 0) к если (! searchString.length) – Duc

ответ

1

Да. Забудьте файлы и сохраните их в базе данных. Создайте свои индексы. Все становится простым оператором SQL.

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