Я работаю над алгоритмом поиска весь день, и мне хотелось бы получить некоторые мнения. Некоторые из того, что я делаю, специфичны для iOS, но общих концепций нет.Быстрый поиск и сортировка
Я пытаюсь отобразить набор данных, каталог. В каталоге у меня есть отделы и люди. Я знаю, это звучит как пример учебника, выслушайте меня. Я обещаю, что это не домашнее задание. (Я могу предоставить скриншоты того, над чем я работаю.)
У меня есть массив записей, где есть два вида записей в каталоге. Мне нужно отсортировать записи по имени, а затем разбить массив на меньшие массивы, где каждый под-массив содержит записи, начинающиеся с одной и той же буквы.
Кроме того, мне нужно учитывать строку поиска, которую пользователь может ввести.
Мой общий процесс таков:
Фильтр все элементы, которые соответствуют типу и строки поиска, если есть один. Для этого шага я использую 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];
Сортировать результаты по алфавиту.
array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [((BRKDirectoryEntry *)obj1).comperableTitle compare:((BRKDirectoryEntry *)obj2).comperableTitle]; }];
Разбить результаты на меньшие массивы. Для производительности я пропущу этот шаг, если мы ищем, но он, похоже, не помогает.
if(alphabetized) { array = [self _alphabetizedArrayFromPresortedArray:array]; }
Выполнение этого в общей сложности 950 записей плачевно.
Теперь, для моего дисплея по умолчанию, я могу уйти с простое кеширование отсортированных данных в памяти, а затем отображение и прокрутка выполняются красиво, но для поиска по-одному-типа просто невозможно достичь гладкой которые ожидают пользователи.
Любые указатели или подсказки?
Я все еще удивляюсь, как много людей спрашивают: «Я делаю XYZ, и это слишком медленно. Как я могу сделать это быстрее?» Как будто у других людей есть большой шанс. Есть метод швейцарской армии, который не может потерять. [* Пусть сама программа скажет вам ответ. *] (Http://stackoverflow.com/a/378024/23771) Вот [* короткий пример *] (http://stackoverflow.com/a/4299378/23771) (в python, но вы получите идею). –
Просто маленький совет: использование предиката намного медленнее, чем быстрое перечисление, как показано здесь: https://www.objc.io/issues/7-foundation/collections/ (раздел ** Перечисление и обмен сообщениями более высокого порядка **) И я думаю, что вы можете упростить эту строку кода если (! SearchString || searchString.length == 0) к если (! searchString.length) – Duc