Бинарный поиск в NSMutableArray NSDictionary

Привет всем! Первый вопрос здесь, поэтому, пожалуйста, будьте нежны :). Я немного знаком с Objective-C, но у меня есть некоторые проблемы с деталями. Короче говоря, я хочу знать, как я могу выполнить двоичный поиск в NSMutableArray NSDictionaries и в этом поиске искать синтаксис частичной строки. У меня есть NSMutableArray из NSDictionaries, где массив представляет собой список контактов, а каждый NSDictionary — это один контакт (с четырьмя фрагментами информации). Мне удалось отсортировать массив, используя

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:type  ascending:YES];
[addressBook sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];

где ключ — это пользовательский ключ в словаре. Часть функциональности программы заключается в выполнении поиска по префиксу для каждой части данных в отдельных контактах.

Итак, пока я нашел -indexOfObject:inSortedRange:options:usingComparator: (и, в частности, этот пост, я не могу понять, как настроить поиск как на поиск префикса строки, так и на реализацию синтаксиса блока для самого поиска.

Я пробовал это, но я просто получаю очень полезную ошибку «Ожидаемое выражение», поскольку я предполагаю, что не могу заменить indexOfObjectPassingTest на indexOfObject.

unsigned index2 = [addressBook 
            indexOfObjectPassingTest:<#^BOOL(id obj, NSUInteger idx, BOOL *stop)predicate#>:^(id obj, NSUInteger idx, BOOL *stop)
                       inSortedRange:NSMakeRange(0, [addressBook count]) 
                             options:NSBinarySearchingFirstEqual 
                     usingComparator:(NSComparator^(id obj1, id obj2)];

Я был бы признателен за любую помощь в том, чтобы заставить -indexOfObject:inSortedRange:options:usingComparator: работать, или если у кого-то есть другое предложение для бинарного поиска в NSArray NSDictionaries, я все уши.

(И да, хотя это для задания алгоритмов, оно не зависит от языка программирования. Я пытаюсь максимизировать скорость, поэтому я думал о массиве каждый раз, когда вы его ищете. Я также думал о создании копий массива сортируется для каждого ключа словаря, но, поскольку мы имеем дело с большими CSV-файлами, это кажется немного чрезмерным, поэтому любые другие асимптотические подсказки для Mac будут НАМНОГО оценены, поскольку их часто трудно найти в документации Apple.)


person chrismanderson    schedule 22.02.2011    source источник
comment
Почему вы используете для этого Objective C? Это было бы абсолютно неэффективно и своего рода изобретением велосипеда. Просто используйте NSDictionary из NSDictionaries. Или используйте для этого старый добрый C, если вам нужна производительность, потому что ObjC принципиально медленнее.   -  person Max    schedule 23.02.2011
comment
В основном потому, что я пытаюсь изучить Objective C :). Речь идет не о производительности по сравнению с другими типами кода, а только о производительности в наших собственных реализациях. В основном я уверен, что наш профессор хочет какой-то бинарный поиск. Итак, если вы предлагаете использовать NSDictionary из NSDictionary, вы не можете его отсортировать, потому что NSDictionary по определению несортируется, верно? Итак, вы бы просто линейно перебирали контейнер NSDictionary?   -  person chrismanderson    schedule 23.02.2011
comment
Что ж, вы можете использовать отсортированный массив ключей для доступа к словарю в определенном порядке. Хотя я думаю, что это не лучший способ изучения ObjC (реализация базовых алгоритмов) :) Это слишком высокий уровень для этого. Используйте С =)   -  person Max    schedule 23.02.2011


Ответы (1)


Платформа Foundation не позволяет вам явно указать двоичный поиск в NSArray, если у вас уже нет объекта и вы ищете значение индекса (ну, очевидно, массивы не всегда сортируются).

Одна вещь, которую вы можете сделать, это получить массив значений для указанного ключа, преобразовать его в CFArray (бесплатно) и использовать функцию CFArrayBSearchValue от Core Foundation.

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

person MHC    schedule 22.02.2011
comment
Спасибо - в итоге я применил подход категорий (и узнал о них в процессе!), Так что предложение очень ценится. - person chrismanderson; 29.03.2011
comment
Я не понимаю. Что может CFArrayBSearchValues() сделать такое, чего не может -indexOfObject:inSortedRange:options:usingComparator: NSArray? - person user102008; 21.04.2011
comment
В любом случае CFArrayRef и NSArray* соединены бесплатно. Вы можете просто привести один тип к другому, и он будет работать точно так же, поэтому вы все равно можете использовать либо CFArrayBSearchValues(), либо -indexOfObject:inSortedRange:options:usingComparator:. - person ; 17.02.2012