Я думал о том, как мой бинарный поиск можно оптимизировать. Код следует. Что я до сих пор делал:Как оптимизировать бинарный поиск?
Все, что я мог придумать, заключалось в обработке различных материалов.
Оптимизированный наихудший случай (один из наихудших случаев), когда элемент, находящийся в поиске, выходит за пределы, то есть ищет число, меньшее, чем самое низкое или выше самого высокого. Это сохраняет сравнение O (logn), когда оно является гарантией, что оно не будет найдено на входе.
int input[15] = {1,2,2,3,4,5,5,5,5,6,7,8,8,9,10};
/*
* Returns index p if a[p] = value else -ve int.
* value is value being searched in input.
*/
int
binary_search (int * input, int low, int high, int value)
{
int mid = 0;
if (!input) return -1;
if (low > high) return -1;
/* optimize worst case: value not in input */
if ((value < input[low]) || (value > input[high]))
{ return -2; }
mid = (low + high)/2;
if (input[mid] == value) {
return mid;
}
if (input[mid] > value) {
return binary_search(input, low, mid -1, value);
} else {
return binary_search(input, mid+1, high, value);
}
}
Еще худший случай я могу вспомнить, когда ищется значение находится рядом с середины входа или первого элемента. Я думаю, что более обобщенными являются нижние/верхние границы ввода для каждого вызова binary_search. Это также требует, чтобы алгоритм выполнял точные сопоставления логов.
Любые другие предложения о том, в каких других областях я могу сосредоточиться на улучшении. Мне не нужен код, но направление было бы полезно. Благодарю.
Лучшей оптимизированные для бинарного поиска по моему мнению, не использовать его вообще-то при n <1000 (поскольку O (log (n)) и O (n) более или менее одинаковы в любом случае благодаря промахам в кэше), а на больших наборах данных предварительно вычитают 3 или 4 подразделения на одну итерацию (легко, так как это заранее известно). – Damon
Очевидное: перепишите рекурсию на итерацию. Ваш компилятор может это сделать, но нет никакой гарантии. – harold