edubun
Русский

Что такое алгоритм

Способ нахождения наибольшего общего делителя из 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? (Цикл выше возвращает другое число, и это правильный ответ.) Что, если числа равны? Если подумать о крайних случаях до запуска кода, многие ошибки ловятся заранее.

КонтекстСлово «алгоритм» происходит от имени человека. Мухаммад ибн Муса аль-Хорезми работал в Багдаде в 9 веке и написал книгу о вычислениях с индийскими цифрами от 0 до 9. Её латинский перевод начинается словами «Dixit algorizmi», что значит «сказал аль-Хорезми», и обычно называется «Algoritmi de numero Indorum». Латинские формы его имени, algorizmi и algoritmi, стали словом для пошагового способа вычисления. Его книга о решении уравнений дала нам ещё одно слово: алгебра. Гораздо позже, в 1843 г., Ада Лавлейс опубликовала примечания к так и не построенной аналитической машине Чарльза Бэббиджа; последнее из них, примечание G, шаг за шагом описывает, как машина могла бы вычислять числа Бернулли.
  • Около 300 г. до н. э.: «Начала» Евклида, VII книга: способ нахождения наибольшего общего делителя.
  • 9 век: Аль-Хорезми в Багдаде пишет об индийских цифрах; латинская форма его имени дала слово «алгоритм».
  • 1843: Примечание G Ады Лавлейс: шаги, по которым аналитическая машина вычисляет числа Бернулли.
  • 1945: Джон фон Нейман предлагает сортировку слиянием.
  • 1959: Тони Хоар придумывает быструю сортировку в Москве (опубликована в 1961 г.).
алгоритмКонечный список точных шагов, который превращает входные данные в правильный результат
входные данныеДанные, с которых начинает алгоритм
выходные данныеРезультат, который должен выдать алгоритм
правильныйДаёт верный результат для любых допустимых входных данных
конечныйВсегда останавливается через некоторое число шагов
наибольший общий делительНаибольшее целое число, на которое оба числа делятся нацело
крайний случайНеобычные входные данные, например 0, пустой список или равные значения
число шаговСколько базовых операций выполняет алгоритм
  1. Каков наибольший общий делитель 48 и 18 по алгоритму Евклида?
  2. Сколько делений нужно алгоритму Евклида для 1071 и 462?
  3. Какое из этих свойств не обязательно для каждого алгоритма?
    • Останавливается через конечное число шагов
    • Каждый шаг точен
    • Использует компьютер
    • Даёт верный результат для любых допустимых входных данных
  4. Почему алгоритм Евклида всегда останавливается?
    • Остаток всегда меньше делителя, поэтому уменьшается до 0
    • Он останавливается через 10 кругов
    • Компьютеры останавливают циклы автоматически
    • Числа растут, пока не совпадут
  5. Слово «алгоритм» происходит от имени
    • Евклида
    • аль-Хорезми
    • Ады Лавлейс
    • Алана Тьюринга
  6. Почему специалисты по информатике считают шаги, а не засекают секунды?
    • Секунды зависят от машины; число шагов зависит только от алгоритма и входных данных
    • Часы неточны
    • Шаги всегда быстрее
    • Секунды нельзя измерить в коде
  7. Метод дал правильный ответ на пяти примерах, которые ты попробовал. Он правильный?
    • Да, пять примеров это доказывают
    • Не обязательно: он должен быть верен для любых допустимых входных данных
    • Только если он быстрый
    • Только если в нём есть цикл
  8. Что вернёт gcd(35, 0) с циклом из этого урока?
  9. В каком году Ада Лавлейс опубликовала свои примечания, включая примечание G?
    • 1801
    • 1843
    • 1945
    • 1961
  10. Расставь шаги алгоритма Евклида по порядку.
Главное
  • Алгоритм является конечным списком точных шагов от входных данных к правильному результату.
  • Алгоритм Евклида находит наибольший общий делитель через повторное взятие остатков.
  • У одной задачи может быть много правильных алгоритмов с очень разным числом шагов.
  • Прежде чем писать шаги, запиши входные данные, результат и крайние случаи.
  • Слово происходит от латинской формы имени аль-Хорезми.
Источники курса (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