#algorithm #search #language-agnostic
#алгоритм #Поиск #не зависит от языка
Вопрос:
Можем ли мы выбрать любую базу по нашему вкусу или база выбрана потому, что она обеспечивает максимальную эффективность?
Я рассматривал этот алгоритм. Что в основном дает это:
template <typename T>
int exponential_search(T arr[], int size, T key) {
if (size == 0) {
return NOT_FOUND;
}
int bound = 1;
while (bound < size amp;amp; arr[bound] < key) {
bound *= 2;
}
return binary_search(arr, key, bound/2, min(bound 1, size));
}
Или эквивалент Python:
def exponential_search(arr, p):
i = 0
while (arr[2 ** i] < p):
i = 1
binary_search(arr, p, i)
Как можно ясно видеть во втором цикле while, они устанавливают
bound *=2
Почему 2? Почему не любое другое число?
Комментарии:
1. Бессмысленно без дополнительного контекста, но, вероятно, вы смотрите на тип двоичного поиска — проблема уменьшается вдвое для каждой рекурсивной глубины, отсюда и степень 2.
2. @500-InternalServerError Я добавил еще немного контекста.
3. Вариант с основанием 3 был бы просто более сложным при небольшом выигрыше.
4. @HenkHolterman Почему это должно быть сложнее? Я думаю, это будет лучше работать с большими наборами данных?
5. Но с меньшими наборами данных можно легко справиться благодаря бинарному поиску.
Ответ №1:
Если не учитывать трудности реализации, стоимость поиска позиции n с множителем k равна log(n)/log(k) log((k-1)n) O(1) = log(n)/log(k) log(n) log(k-1) log(k-1) O(1). Увеличивая k, мы можем приблизиться к постоянному коэффициенту, но не достичь 1, однако стоимость является увеличением постоянного члена. Я полагаю, что 2 работает достаточно хорошо.
Комментарии:
1. Извините, но не могли бы вы, пожалуйста, объяснить, как вы пришли к этой формуле сложности.
2. Кроме того, график формулы говорит, что минимум сложности составляет около k = 8.387.
3. @harshit Наилучшее k увеличивается по мере увеличения n. Формула представляет собой экспоненциальный поиск (логарифм основания k от n, первое слагаемое) плюс двоичный поиск по (k-1) n элементам.
4. Извините, я не очень знаком с этой концепцией сложности, но не следует ли вам перемножить два логарифма. Выполняется экспоненциальный поиск, а затем двоичный поиск. Разве это не должно следовать правилу Product
5. @harshit en.wikipedia.org/wiki /…