Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Алгоритмы и их эффективность

💻 Информатика · 10 класс

Свойства алгоритмов, сложность, поиск и сортировка.

Программный код на экране
Программный код на экранеMartin Vorel · Wikimedia Commons · CC BY-SA 4.0

Алгоритмы и их эффективность

Алгоритм — конечная последовательность точных команд, ведущая от исходных данных к результату. В 10 классе акцент смещается с самого понятия на эффективность: одну задачу можно решить разными алгоритмами, и важно выбрать тот, что работает быстрее и экономнее. Эффективность оценивают по затратам времени (число операций) и памяти при росте объёма входных данных n.

Сложность алгоритма

Вычислительная сложность показывает, как растёт число операций с увеличением n. Её записывают через скорость роста. Если для массива из n элементов алгоритм делает порядка n действий — это линейная сложность; если n² — квадратичная; если порядка log n — логарифмическая (очень быстрая).

СложностьРост операцийПример алгоритма
Логарифмическаяlog nДвоичный поиск
ЛинейнаяnЛинейный поиск, сумма массива
Квадратичнаяn²Сортировка «пузырьком»

Поиск элемента

Линейный поиск перебирает элементы подряд, пока не найдёт нужный, — в худшем случае n сравнений. Если массив отсортирован, работает двоичный (бинарный) поиск: он сравнивает искомое со средним элементом и каждый раз отбрасывает половину диапазона.

лево = 1, право = n пока лево <= право   середина = (лево + право) / 2   если A[середина] = x → нашли, стоп   если A[середина] < x → лево = середина + 1   иначе → право = середина - 1

В массиве из 1000 элементов линейный поиск может сделать 1000 сравнений, а двоичный — около 10, ведь каждый шаг сокращает область вдвое.

Сортировка

Сортировка пузырьком многократно проходит по массиву, меняя местами соседние элементы, если они стоят в неверном порядке; за каждый проход наибольший элемент «всплывает» в конец. Это наглядный, но медленный метод сложности n². Существуют более быстрые сортировки (слиянием, быстрая) со сложностью порядка n·log n.

для i от 1 до n-1   для j от 1 до n-i     если A[j] > A[j+1]       то поменять местами A[j] и A[j+1]

Здесь два вложенных цикла дают как раз порядок n² сравнений. На массиве из 10 элементов это около 100 операций, а на 1000 — уже около миллиона: вот почему квадратичные алгоритмы плохо подходят для больших данных.

Почему сложность важна

Разница в сложности проявляется именно с ростом n. При n = 10 квадратичный и линейный алгоритмы почти неотличимы, но при n = 1 000 000 квадратичный потребует триллион операций и «зависнет», а логарифмический управится за два десятка шагов. Поэтому при работе с большими объёмами данных выбор эффективного алгоритма важнее мощности компьютера.

Практическое правило. Двоичный поиск применим только к упорядоченному массиву — на неотсортированных данных он даст неверный ответ. Прежде чем ускорять поиск, оцените, не дороже ли обойдётся сортировка. Для маленьких n разница в сложности почти незаметна, она важна на больших данных.

Трассировка: выполняем команды буквально

Для анализа программы выпишите начальные значения и после каждого шага обновляйте только те переменные, которым присвоено новое значение. Не подменяйте команду предполагаемым намерением автора. В Python присваивание n = n // 2 сначала вычисляет правую часть по старому n и только потом заменяет n.

n = 19
s = 0
while n > 0:
    if n % 2 == 1:
        s += n
    n //= 2
print(s)
n в начале шагаНечётное?s после ifn после деления
19Да199
9Да284
4Нет282
2Нет281
1Да290

Ответ: 29. Условие while проверяется ещё раз при n = 0, но тело шестой раз не выполняется. Количество итераций для положительного целого n равно ⌊log₂n⌋ + 1; при n = 0 итераций нет.

Логические условия

В Python среди not, and, or сначала выполняется not, затем and, затем or. Скобки могут явно изменить группировку. Например, для x = 5, y = 0 выражение x > 3 or y > 0 and x < 0 истинно: оно означает (x > 3) or ((y > 0) and (x < 0)). Запись ((x > 3) or (y > 0)) and (x < 0) уже ложна.

Проверяем завершение

В примере положительное n при каждом шаге уменьшается и достигает нуля. Если забыть n //= 2, условие останется истинным и программа зациклится. Одна успешная трассировка подтверждает результат для выбранного входа; для общего вывода нужно рассуждение обо всех допустимых данных.

Для исполнителя на клетчатом поле аналогично записывают текущую клетку, результат проверки стен и реально выполненную команду. Условия «справа свободно ИЛИ снизу свободно» и «И» останавливают движение в разных ситуациях.

Справочные материалы: Алгоритмы и их эффективность — исходная тема; Алгоритмы и их эффективность — исходная тема. Связанные уроки: Трассировка алгоритма по шагам, Что такое логические операции.

Первоисточники: Python: логические операции и приоритет.

Кратко о главном

  • Эффективность алгоритма оценивают по затратам времени и памяти при росте n.
  • Сложность бывает логарифмической, линейной, квадратичной и др.
  • Линейный поиск работает всегда, двоичный — только в отсортированном массиве, но гораздо быстрее.
  • Сортировка пузырьком проста, но медленна (n²); есть методы быстрее.
  • Выбор алгоритма особенно важен при больших объёмах данных.