Если ваш массив не огромен, пробовали ли вы выполнить простой линейный поиск в массиве, отслеживая при этом «лучшее совпадение на данный момент»?Наилучшее совпадение можно определить с помощью функции оценки / взвешивания / оценки, которую вы применяете к каждому элементу в массиве последовательно.Предмет с наибольшим количеством очков выигрывает.Инициализируйте две переменные с именами скажем bestMatchIndex и bestMatchScore.Используйте цикл for, чтобы пройти через массив.Для каждого элемента вызовите функцию оценки, чтобы получить его оценку.Сравните это с лучшим MatchScore.Если оценка текущего элемента выше, установите переменные bestMatch для текущего элемента.В конце цикла переменные bestMatch указывают на «лучшее совпадение».
Функция оценки может быть настолько простой или сложной, насколько вы хотите.
Вот пример оценкифункция (я знаю, вы сказали, что вы не ищете реализацию, но иногда некоторый код стоит тысячи слов).В этом примере я ищу элементы, которые меньше всего отличаются как по ширине, так и по высоте и соотношению.Ваши требования могут быть другими.
-(double)itemScoreForWidth:(double)itemWidth height:(double)itemHeight
{
const double targetWidth = 400.0;
const double targetHeight = 600.0;
const double targetScore = 7.0;
double widthDiff = (itemWidth / targetWidth);
double heightDiff = (itemHeight / targetHeight);
double ratioDiff = ((itemWidth/itemHeight) / (targetWidth/targetHeight));
double product = (4 * ratioDiff) + (2 * widthDiff) + heightDiff;
return fabs(targetScore - product);
}
(Реализация может быть более сложной, чем необходимо.)
Запустив это с некоторыми примерами измерений, мы получим:
score for 400x600 : 0.000000
score for 401x600 : 0.015000
score for 401x601 : 0.009994
score for 401x598 : 0.025078
score for 500x700 : 0.952381
score for 602x400 : 5.706667
score for 200x300 : 1.500000
score for 800x1200: 3.000000
score for 410x610 : 0.099454
score for 600x400 : 5.666667
Таким образом, в этом примере, предмет с наименьшим счетом должен «выиграть».«Победитель» зависит от функции подсчета очков.Выше, если бы был выбор между 500x700 и 600x400, 500x700 выиграл бы.