Это довольно простая проблема.
Как указывает Ави в своем комментарии, есть две части: метод, который вы используете для сопоставления, и метод, который вы используете для поиска этих совпадений.
Если ваш массив отсортирован и вы ищете единственное идеальное совпадение, вы можете использовать двоичный поиск. Я считаю, что это даст вам производительность O (log (n)). (Время увеличивается с журналом количества элементов.)
Однако вы не ищете ни одного идеального матча. Вы ищете частичные матчи. Если они всегда должны совпадать с началом строки, вы все равно сможете использовать двоичный поиск, чтобы найти первое совпадение, а затем линейно искать вверх и вниз в массиве до первого несоответствия. Это даст вам немного хуже производительности O (log (n)), но не так плохо, как O (n).
Если вы соответствуете своей подстроке где-нибудь внутри записей, я думаю, вам придется проверять каждый элемент в массиве. Вам просто нужно будет проверить каждый элемент, предоставляя вам O (n) производительность.
Обратите внимание, что производительность O (n) обычно считается хорошей. Он хорошо масштабируется для больших наборов данных. (Вы хотите избежать производительности O (n^2). Это то, что вас убивает.)
Вторая часть проблемы - совпадение скорости. Вероятно, вы можете получить немного лучшую производительность, чем предикат, написав свою собственную процедуру соответствия строк, которая жестко закодирована для ваших точных критериев соответствия, но прирост производительности, скорее всего, будет скромным. Вам нужно будет дать более подробную информацию о том, что составляет матч, чтобы мы могли помочь с этой частью.
Если массив отсортирован, самым быстрым вы получите двоичный поиск. Если нет, лучшее, что вы можете сделать, это линейное. Другие структуры данных могут оцениваться немного лучше, чем двоичный поиск, но, вероятно, этого недостаточно. – Avi
Кроме того, 'NSPredicate' - это метод сопоставления элементов.Он не описывает обход контейнера, и это ваш вопрос. – Avi
Вы должны научиться давать свои методы хорошим именам. «searchString:» абсолютно бессмысленна. Если вы намерены вернуть массив со всеми строками, имеющими определенный префикс, назовите его «stringsWithPrefix:» – gnasher729