Ответ
Логарифмическая сложность O(log n) означает, что время выполнения алгоритма растёт пропорционально логарифму от размера входных данных (n). Это очень эффективная сложность, так как количество операций растёт медленно.
Для n = 100 элементов, количество операций будет примерно равно логарифму по основанию 2 от 100:
log₂(100) ≈ 6.64
В реальных алгоритмах, таких как бинарный поиск, количество шагов — это целое число. Поэтому потребуется 7 операций (округление вверх).
Наглядный пример роста:
| Количество элементов (n) | Примерное число операций (log₂ n) |
|---|---|
| 8 | 3 |
| 100 | 7 |
| 1,000 | 10 |
| 1,000,000 | 20 |
Пример на Go (бинарный поиск):
// binarySearch ищет target в отсортированном срезе arr
// и возвращает количество выполненных итераций.
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)-1
steps := 0
for low <= high {
steps++ // Считаем итерацию
mid := low + (high-low)/2 // Безопасный способ избежать переполнения
if arr[mid] == target {
return steps
} else if arr[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return steps // Возвращаем шаги, даже если элемент не найден
}
// Для отсортированного массива из 100 элементов
// функция вернет максимальное значение 7. Ответ 18+ 🔞
Да ты посмотри на эту красоту — логарифмическая сложность O(log n)! Это ж как в сказке про репку, только наоборот: чем больше народу, тем быстрее ты находишь того, кто тебе нужен. Сука, магия, а не алгоритм!
Вот смотри, если у тебя n = 100 элементов, то операций будет примерно логарифм по основанию два от ста:
log₂(100) ≈ 6.64
Ну, в жизни-то шаги целые, поэтому на деле выйдет 7 операций — округляем вверх, как будто последний кусок пиццы забираешь.
И чтобы ты совсем не обосрался от удивления, глянь на рост:
| Элементов (n) | Операций (log₂ n) |
|---|---|
| 8 | 3 |
| 100 | 7 |
| 1,000 | 10 |
| 1,000,000 | 20 |
Видишь? Миллион элементов — а шагов всего двадцать! Это ж надо было такую хуйню придумать, просто пиздец!
А вот тебе живой пример на Go, чтоб ты не думал, что это всё сказки:
// binarySearch ищет target в отсортированном срезе arr
// и возвращает количество выполненных итераций.
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)-1
steps := 0
for low <= high {
steps++ // Считаем итерацию
mid := low + (high-low)/2 // Безопасный способ избежать переполнения
if arr[mid] == target {
return steps
} else if arr[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return steps // Возвращаем шаги, даже если элемент не найден
}
// Для отсортированного массива из 100 элементов
// функция вернет максимальное значение 7.
Вот так вот, блядь! Берёшь отсортированный массив, делишь пополам, отбрасываешь ненужное — и через семь шагов уже либо нашёл, либо понял, что него хуя там нет. Красота, ёпта!