Что такое алгоритм
Способ нахождения наибольшего общего делителя из VII книги «Начал» Евклида, написанных около 2300 лет назад, до сих пор работает в компьютерах.
Метод, который всегда работает
Допустим, нужно найти наибольшее число, на которое делятся и 1071, и 462. Можно перебрать все числа от 462 до 1 и остановиться на первом, на которое делятся оба. Это сработает, но может понадобиться несколько сотен попыток. Есть путь короче. Раздели 1071 на 462 и запомни остаток, 147. Теперь раздели 462 на 147 и запомни остаток, 21. Раздели 147 на 21: остаток 0, значит, ответ 21. Три деления вместо нескольких сотен.
Этот короткий путь является алгоритмом: конечным списком точных шагов, который получает входные данные и выдаёт правильный результат. Это алгоритм Евклида для наибольшего общего делителя, он есть в VII книге «Начал», написанных около 300 г. до н. э. Евклид описывал его через повторное вычитание отрезков, а не деление, но идея та же, а вариантом с остатками программы пользуются сегодня.
function gcd(a, b) {
while (b !== 0) {
const r = a % b; // остаток
a = b;
b = r;
}
return a;
}
console.log(gcd(1071, 462)); // 21Что делает список шагов алгоритмом
Учебники, например книга Кормена, Лейзерсона, Ривеста и Штайна, описывают алгоритм как чётко определённую процедуру, которая превращает входные данные в выходные. В это описание уложены три свойства, и каждое важно, когда пишешь код.
- Точность. Каждый шаг значит одно. «Раздели a на b и запомни остаток» сказано точно; «как-нибудь уменьши числа» нет.
- Конечность. Алгоритм должен остановиться. В алгоритме Евклида остаток всегда меньше числа, на которое делили, поэтому он уменьшается каждый круг и обязательно дойдёт до 0.
- Правильность. Для любых допустимых входных данных результат верен, а не только для примеров, которые ты попробовал.
В качестве бытового примера часто приводят кулинарный рецепт, и это честный пример: продукты являются входными данными, блюдо является результатом, а шаги идут по порядку. Разница в том, сколько додумывает читатель. Повар сам решает, что значит «щепотка». Компьютер не решает ничего, поэтому алгоритмы для компьютеров записывают, проговаривая каждый шаг.
Одна задача, разные алгоритмы
У одной задачи обычно много правильных алгоритмов, и объём работы у них может отличаться огромно. Для наибольшего общего делителя 1071 и 462 перебор всех чисел от 462 вниз требует 442 попыток, прежде чем дойдёт до 21, а методу Евклида нужно 3 деления. Оба правильные. Быстрый только один. Большая часть этого курса посвящена второму вопросу: если метод правильный, сколько шагов он делает и как растёт это число, когда входные данные становятся больше?
Чтобы ответить, специалисты по информатике считают базовые шаги (сравнение, обмен, деление), а не секунды. Секунды зависят от машины. Число шагов зависит только от алгоритма и входных данных, поэтому позволяет честно сравнивать два метода. Лаборатория ниже считает сравнения за тебя, пока сортирует ряд столбиков. Попробуй один и тот же начальный порядок с двумя разными способами и следи за счётчиками.
Перетащи, чтобы повернуть. Колёсико или щипок для масштаба.
Вход, выход и шаги между ними
Прежде чем писать алгоритм, точно запиши, что поступает на вход и что должно выйти. Для наибольшего общего делителя: на входе два целых положительных числа, на выходе одно целое число, на которое делятся оба, причём никакое большее число этого не делает. Такое описание подсказывает, как проверить результат, и часто намекает на шаги. Оно же выявляет крайние случаи: что, если одно из чисел 0? (Цикл выше возвращает другое число, и это правильный ответ.) Что, если числа равны? Если подумать о крайних случаях до запуска кода, многие ошибки ловятся заранее.
- Около 300 г. до н. э.: «Начала» Евклида, VII книга: способ нахождения наибольшего общего делителя.
- 9 век: Аль-Хорезми в Багдаде пишет об индийских цифрах; латинская форма его имени дала слово «алгоритм».
- 1843: Примечание G Ады Лавлейс: шаги, по которым аналитическая машина вычисляет числа Бернулли.
- 1945: Джон фон Нейман предлагает сортировку слиянием.
- 1959: Тони Хоар придумывает быструю сортировку в Москве (опубликована в 1961 г.).
| алгоритм | Конечный список точных шагов, который превращает входные данные в правильный результат |
| входные данные | Данные, с которых начинает алгоритм |
| выходные данные | Результат, который должен выдать алгоритм |
| правильный | Даёт верный результат для любых допустимых входных данных |
| конечный | Всегда останавливается через некоторое число шагов |
| наибольший общий делитель | Наибольшее целое число, на которое оба числа делятся нацело |
| крайний случай | Необычные входные данные, например 0, пустой список или равные значения |
| число шагов | Сколько базовых операций выполняет алгоритм |
- Каков наибольший общий делитель 48 и 18 по алгоритму Евклида?
- Сколько делений нужно алгоритму Евклида для 1071 и 462?
- Какое из этих свойств не обязательно для каждого алгоритма?
- Останавливается через конечное число шагов
- Каждый шаг точен
- Использует компьютер
- Даёт верный результат для любых допустимых входных данных
- Почему алгоритм Евклида всегда останавливается?
- Остаток всегда меньше делителя, поэтому уменьшается до 0
- Он останавливается через 10 кругов
- Компьютеры останавливают циклы автоматически
- Числа растут, пока не совпадут
- Слово «алгоритм» происходит от имени
- Евклида
- аль-Хорезми
- Ады Лавлейс
- Алана Тьюринга
- Почему специалисты по информатике считают шаги, а не засекают секунды?
- Секунды зависят от машины; число шагов зависит только от алгоритма и входных данных
- Часы неточны
- Шаги всегда быстрее
- Секунды нельзя измерить в коде
- Метод дал правильный ответ на пяти примерах, которые ты попробовал. Он правильный?
- Да, пять примеров это доказывают
- Не обязательно: он должен быть верен для любых допустимых входных данных
- Только если он быстрый
- Только если в нём есть цикл
- Что вернёт gcd(35, 0) с циклом из этого урока?
- В каком году Ада Лавлейс опубликовала свои примечания, включая примечание G?
- 1801
- 1843
- 1945
- 1961
- Расставь шаги алгоритма Евклида по порядку.
- Алгоритм является конечным списком точных шагов от входных данных к правильному результату.
- Алгоритм Евклида находит наибольший общий делитель через повторное взятие остатков.
- У одной задачи может быть много правильных алгоритмов с очень разным числом шагов.
- Прежде чем писать шаги, запиши входные данные, результат и крайние случаи.
- Слово происходит от латинской формы имени аль-Хорезми.
Источники курса (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Проверено: 2026-10-17