Полный перебор пар: вложенные циклы и границы сложности
Автор: Казачкин Даниил Михайлович · Обновлено
Вложенный цикл — это цикл внутри другого цикла. Он нужен, когда требуется перебрать пары элементов, клетки таблицы, координаты, варианты паролей или все сочетания небольшого…
Вложенный цикл — это цикл внутри другого цикла. Он нужен, когда требуется перебрать пары элементов, клетки таблицы, координаты, варианты паролей или все сочетания небольшого размера.
Простой пример — вывести таблицу умножения.
for row in range(1, 6):
for column in range(1, 6):
print(row * column, end=' ')
print()Внешний цикл отвечает за строки, внутренний — за столбцы. После каждой строки вызывается print(), чтобы перейти на новую строку.
Перебор пар
В задачах часто нужно проверить все пары чисел. Чтобы не считать одну и ту же пару дважды, внутренний цикл начинают с i + 1.
numbers = [2, 8, 5, 11]
count = 0
for i in range(len(numbers)):
for j in range(i + 1, len(numbers)):
if numbers[i] + numbers[j] > 10:
count += 1
print(count)Так программа проверяет пары разных элементов и не сравнивает элемент сам с собой.
Когда вложенный цикл опасен
Если элементов мало, вложенный цикл понятен и допустим. Но если элементов 100 000, полный перебор пар станет слишком медленным. В таких случаях ищут другой прием: сортировку, словарь, множество, два указателя или предварительные суммы.
Как тренироваться
Начинайте с задач на таблицы и координаты. Затем переходите к парам чисел, поиску одинаковых элементов и простому перебору вариантов. Каждый раз задавайте вопрос: сколько проверок сделает программа?
Вложенные циклы — важная тема для школьников, потому что они соединяют программирование и комбинаторное мышление. Но их нужно использовать осознанно: полный перебор хорош там, где размер входа позволяет выполнить его за разумное время.
Практикум: уникальные пары с заданной суммой
Для списка 2, 7, 4, 5, 3, 7 найдите пары позиций, значения которых дают 9. Используйте границы i < j, чтобы не сравнивать элемент с собой и не обходить зеркальную пару повторно. Заранее решите, требуются пары индексов или уникальные пары значений: при повторяющихся семёрках ответы различаются. Заполните таблицу первых итераций и посчитайте число сравнений для длины 6, 100 и 10000. После корректной простой версии предложите ускорение через множество, сохранив выбранный контракт результата.
Контрольная точка
Почему два цикла по полному диапазону порождают (i, j) и (j, i)? Покажите, как начальная граница внутреннего цикла устраняет дубли и влияет на число операций.
Частые вопросы
Всегда ли вложенные циклы слишком медленные?
Нет. Для маленьких ограничений полный перебор может быть самым ясным и надёжным решением. Проблема возникает, когда размер данных делает квадратичное число пар слишком большим; решение выбирают после чтения ограничений.
Источники
- Босова Л.Л. Информатика. Базовый курс: учебник для 7-9 классов. - М.: БИНОМ. Лаборатория знаний.
- Поляков К.Ю., Еремин Е.А. Информатика. 10-11 классы. Углубленный уровень.
- Python Documentation: The Python Tutorial.