Алгоритм имеет логарифмическую сложность O(log n). Сколько примерно операций он выполнит для 100 элементов?

Ответ

Логарифмическая сложность 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.

Вот так вот, блядь! Берёшь отсортированный массив, делишь пополам, отбрасываешь ненужное — и через семь шагов уже либо нашёл, либо понял, что него хуя там нет. Красота, ёпта!