Алгоритм


Из Википедии, свободной энциклопедии
  (Перенаправлено с Алгоритмическая проблема )
Перейти к навигации Перейти к поиску

Блок -схема алгоритма ( алгоритм Евклида ) для вычисления наибольшего общего делителя (gcd) двух чисел a и b в местах с именами A и B. Алгоритм работает путем последовательных вычитаний в двух циклах: ЕСЛИ тест B ≥ A дает «да» или «верно» (точнее, число b в ячейке B больше или равно числу a в ячейке A) ТОГДА алгоритм указывает B ← B − A (это означает, что число ba заменяет старое b). Аналогично, ЕСЛИ A > B, ТО A ← A − B. Процесс завершается, когда (содержимое) B равно 0, что дает НОД в A. (Алгоритм взят из Scott 2009:13; символы и стиль рисования из Tausworthe 1977) .
Диаграмма Ады Лавлейс из «ноты G», первого опубликованного компьютерного алгоритма.

В математике и информатике алгоритм ( / ˈ æ l ɡ ə r ɪ ð əm / ( слушать ) ) представляет собой конечную последовательность четко определенных инструкций, обычно используемых для решения класса конкретных задач или для выполнения вычислений. [1] Алгоритмы используются в качестве спецификаций для выполнения вычислений , обработки данных , автоматизированных рассуждений , автоматизированного принятия решений и других задач. Напротив, эвристика Об этом звуке- это подход к решению проблем, который может быть не полностью определен или не может гарантировать правильные или оптимальные результаты, особенно в проблемных областях, где нет четко определенного правильного или оптимального результата. [2]

В качестве эффективного метода алгоритм может быть выражен в пределах конечного количества пространства и времени [3] и на четко определенном формальном языке [4] для вычисления функции . [5] Начиная с начального состояния и начального ввода (возможно , пустого ), [6] инструкции описывают вычисление , которое при выполнении проходит через конечное [7] количество четко определенных последовательных состояний, в конечном итоге производя «выход» [ 8] и завершение в конечном конечном состоянии. Переход из одного состояния в другое не обязательно детерминирован .; некоторые алгоритмы, известные как рандомизированные алгоритмы , включают случайный ввод. [9]

История

Понятие алгоритма существует с древних времен. Арифметические алгоритмы, такие как алгоритм деления , использовались древними вавилонскими математиками c. 2500 г. до н.э. и египетские математики ок. 1550 г. до н.э. [10] Позднее греческие математики в 240 г. до н.э. использовали алгоритмы решета Эратосфена для нахождения простых чисел и алгоритм Евклида для нахождения наибольшего общего делителя двух чисел. [11] Арабские математики , такие как аль-Кинди , в 9 веке использовали криптографические алгоритмы для взлома кода ., основанный на частотном анализе . [12]

Слово « алгоритм » происходит от имени персидского математика 9-го века Мухаммада ибн Муса аль-Хорезми , чья нисба (отождествляющая его с Хорезмом ) была латинизирована как Алгоритми ( арабизированный персидский الخوارزمی c. 780–850). [13] [14]

Мухаммад ибн Муса аль-Хорезми был математиком, астрономом , географом и ученым из Дома Мудрости в Багдаде , чье имя означает «уроженец Хорезма », региона, который был частью Большого Ирана , а ныне находится в Узбекистане . [15] [16] Около 825 года аль-Хорезми написал трактат на арабском языке об индийско-арабской системе счисления , который был переведен на латынь в XII веке. Рукопись начинается с фразы Dixit Algorizmi.(«Так говорил Аль-Хорезми»), где «Алгоризми» было латинизацией переводчиком имени Аль-Хорезми. [17] Аль-Хорезми был самым читаемым математиком в Европе в позднем Средневековье, прежде всего благодаря другой своей книге, « Алгебре » . [18] В позднесредневековой латыни algorismus , английское « алгоризм », искаженное его имя, просто означало «десятичную систему счисления». [19] В 15 веке под влиянием греческого слова ἀριθμός ( арифмос ), «число» ( ср . «арифметика») латинское слово было изменено на алгоритмус, а соответствующий английский термин «алгоритм» впервые засвидетельствован в 17 веке; современный смысл был введен в 19 веке. [20]

В английском языке он впервые был использован примерно в 1230 году, а затем Чосером в 1391 году. Английский принял французский термин, но только в конце 19 века «алгоритм» приобрел то значение, которое он имеет в современном английском языке. [21]

Еще одно раннее использование этого слова относится к 1240 году в руководстве под названием « Кармен де Альгорисмо », составленном Александром де Виледье . Он начинается с:

Haec algorismus ars praesens dicitur, in qua/Talibus Indorum fruimur bis quinque figuris.

что переводится как:

Алгоритм — это искусство, с помощью которого мы в настоящее время пользуемся этими индийскими цифрами, число которых равно двум, умноженным на пять.

Поэма состоит из нескольких сотен строк и обобщает искусство счета с помощью индийских игральных костей нового стиля ( Tali Indorum ) или индуистских цифр. [22]

Частичная формализация современной концепции алгоритма началась с попыток решить Entscheidungsproblem (проблему решения), поставленную Дэвидом Гильбертом в 1928 году. Более поздние формализации были оформлены как попытки определить « эффективную вычислимость » [23] или «эффективный метод». [24] Эти формализации включали рекурсивные функции Гёделя – Хербранда – Клини 1930, 1934 и 1935 годов, лямбда- исчисление Алонзо Чёрча 1936 года, Формулу 1 Эмиля Поста 1936 года и Алана Тьюринга .Машины Тьюринга 1936–37 и 1939 годов.

Неформальное определение

Неофициальным определением может быть «набор правил, который точно определяет последовательность операций», [25] [ нужна цитата для проверки ] , который будет включать все компьютерные программы (включая программы, которые не выполняют числовых вычислений) и (например) любая предписанная бюрократическая процедура [26] или рецепт из кулинарной книги . [27]

В общем, программа является алгоритмом только в том случае, если она в конце концов останавливается [28] — даже несмотря на то, что бесконечные циклы иногда могут оказаться желательными.

Типичным примером алгоритма является алгоритм Евклида , который используется для определения максимального общего делителя двух целых чисел; пример (есть и другие) описан блок-схемой выше и в качестве примера в следующем разделе.

Boolos, Jeffrey & 1974, 1999 предлагают неофициальное значение слова «алгоритм» в следующей цитате:

Ни один человек не может писать достаточно быстро, или достаточно долго, или достаточно мелко† († «все меньше и меньше без ограничений… вы попытаетесь писать на молекулах, на атомах, на электронах»), чтобы перечислить все члены бесконечно бесконечного установить, выписав их имена, одно за другим, в некоторых обозначениях. Но люди могут сделать что-то столь же полезное в случае некоторых счетно бесконечных множеств: они могут дать явные инструкции для определения n -го члена множества для произвольного конечного n . Такие инструкции должны быть даны совершенно явно, в форме, в которой им могла бы следовать вычислительная машина или человек, способный выполнять только самые элементарные операции с символами. [29]

« Исчислимо бесконечное множество» — это множество, элементы которого можно поставить во взаимно однозначное соответствие целым числам. Таким образом, Булос и Джеффри говорят, что алгоритм подразумевает инструкции для процесса, который «создает» выходные целые числа из произвольного «входного» целого числа или целых чисел, которые теоретически могут быть сколь угодно большими. Например, алгоритм может быть алгебраическим уравнением, таким как y = m + n (т. е. две произвольные «входные переменные» m и n , которые дают результат y ), но попытки различных авторов определить это понятие указывают на то, что это слово подразумевает гораздо больше, чем это, что-то порядка (для примера сложения):

Точные инструкции (на языке, понятном «компьютеру») [30] для быстрого, эффективного, «хорошего» [31] процесса, определяющего «ходы» «компьютера» (машины или человека, оснащенного необходимыми внутренними средствами). содержит информацию и возможности) [32] находить, декодировать и затем обрабатывать произвольные входные целые числа/символы m и n , символы + и = … и «эффективно» [33] производить за «разумное» время [34] вывод -integer y в указанном месте и в указанном формате.

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

Большинство алгоритмов предназначены для реализации в виде компьютерных программ . Однако алгоритмы также реализуются другими способами, например, в биологической нейронной сети (например, в человеческом мозгу , реализующем арифметику , или в насекомом, ищущем пищу), в электрической цепи или в механическом устройстве.

Формализация

Алгоритмы необходимы для того, как компьютеры обрабатывают данные. Многие компьютерные программы содержат алгоритмы, подробно описывающие конкретные инструкции, которые компьютер должен выполнять — в определенном порядке — для выполнения определенной задачи, такой как расчет заработной платы сотрудников или печать табелей успеваемости учащихся. Таким образом, алгоритмом можно считать любую последовательность операций, которая может быть смоделирована полной по Тьюрингу системой. Среди авторов, отстаивающих этот тезис, Минский (1967), Сэвидж (1987) и Гуревич (2000):

Минский: «Но мы также будем утверждать вместе с Тьюрингом… что любая процедура, которую можно было бы «естественно» назвать эффективной, на самом деле может быть реализована (простой) машиной. Хотя это может показаться крайним, аргументы… в ее пользу трудно опровергнуть». [35] Гуревич: «… Неформальный аргумент Тьюринга в пользу его тезиса оправдывает более сильный тезис: каждый алгоритм может быть смоделирован машиной Тьюринга… согласно Сэвиджу [1987], алгоритм — это вычислительный процесс, определяемый машиной Тьюринга». [36]

Машины Тьюринга могут определять вычислительные процессы, которые не завершаются. Неформальные определения алгоритмов обычно требуют, чтобы алгоритм всегда завершался. Это требование делает задачу определения того, является ли формальная процедура алгоритмом, невозможной в общем случае из-за основной теоремы теории вычислимости, известной как проблема остановки .

Как правило, когда алгоритм связан с обработкой информации, данные могут быть считаны из источника ввода, записаны на устройство вывода и сохранены для дальнейшей обработки. Сохраненные данные рассматриваются как часть внутреннего состояния объекта, выполняющего алгоритм. На практике состояние хранится в одной или нескольких структурах данных .

Для некоторых из этих вычислительных процессов алгоритм должен быть строго определен: определен таким образом, чтобы он применялся во всех возможных обстоятельствах, которые могут возникнуть. Это означает, что любые условные шаги должны систематически обрабатываться в каждом конкретном случае; критерии для каждого случая должны быть четкими (и вычислимыми).

Поскольку алгоритм представляет собой точный список точных шагов, порядок вычислений всегда имеет решающее значение для функционирования алгоритма. Обычно предполагается, что инструкции перечислены явно и описываются как начинающиеся «сверху» и идущие «вниз» — идея, которая более формально описывается потоком управления .

До сих пор обсуждение формализации алгоритма исходило из предпосылок императивного программирования . Это наиболее распространенная концепция, которая пытается описать задачу дискретными, «механическими» средствами. Уникальной для этой концепции формализованных алгоритмов является операция присваивания , которая устанавливает значение переменной. Оно вытекает из интуиции « памяти » как блокнота. Пример такого задания можно найти ниже.

Для некоторых альтернативных концепций того, что представляет собой алгоритм, смотрите функциональное программирование и логическое программирование .

Выражение алгоритмов

Алгоритмы могут быть выражены во многих видах нотации, включая естественные языки , псевдокод , блок -схемы , дракон-диаграммы , языки программирования или управляющие таблицы (обрабатываемые интерпретаторами ). Выражения алгоритмов на естественном языке, как правило, многословны и неоднозначны и редко используются для сложных или технических алгоритмов. Псевдокод, блок-схемы, дракон-диаграммыа управляющие таблицы — это структурированные способы выражения алгоритмов, которые позволяют избежать многих двусмысленностей, характерных для операторов, основанных на естественном языке. Языки программирования в первую очередь предназначены для выражения алгоритмов в форме, которую может выполнить компьютер, но также часто используются как способ определения или документирования алгоритмов.

Существует большое разнообразие возможных представлений, и можно выразить данную программу машины Тьюринга в виде последовательности машинных таблиц (см. Конечный автомат , таблицу переходов состояний и таблицу управления для получения дополнительной информации), как блок -схемы и диаграммы драконов (см. Диаграмму состояний для получения дополнительной информации), или как форму рудиментарного машинного кода или ассемблерного кода , называемого «набором четверок» (подробнее см. « Машина Тьюринга» ).

Представления алгоритмов можно разделить на три общепринятых уровня описания машины Тьюринга следующим образом: [37]

1 Высокоуровневое описание
«… прозой, чтобы описать алгоритм, игнорируя детали реализации. На этом уровне нам не нужно упоминать, как машина управляет своей лентой или головкой».
2 Описание реализации
«…проза использовалась для определения того, как машина Тьюринга использует свою голову и как она хранит данные на своей ленте. На этом уровне мы не даем подробностей о состояниях или функции перехода».
3 Формальное описание
Наиболее подробный, «самый низкий уровень», дает «таблицу состояний» машины Тьюринга.

Пример простого алгоритма «Добавить m+n», описанного на всех трех уровнях, см . в разделе Алгоритм#Примеры .

Дизайн

Разработка алгоритма относится к методу или математическому процессу решения проблем и инженерных алгоритмов. Разработка алгоритмов является частью многих теорий решения исследования операций , таких как динамическое программирование и принцип « разделяй и властвуй » . Методы проектирования и реализации проектов алгоритмов также называются шаблонами проектирования алгоритмов [38] с примерами, включающими шаблон метода шаблона и шаблон декоратора.

Одним из наиболее важных аспектов разработки алгоритма является эффективность использования ресурсов (время выполнения, использование памяти); нотация большого O используется для описания, например, увеличения времени выполнения алгоритма по мере увеличения размера его входных данных.

Типичные этапы разработки алгоритмов:

  1. Определение проблемы
  2. Разработка модели
  3. Спецификация алгоритма
  4. Разработка алгоритма
  5. Проверка правильности алгоритма
  6. Анализ алгоритма
  7. Реализация алгоритма
  8. Тестирование программы
  9. Подготовка документации [ требуется уточнение ]

Компьютерные алгоритмы

Алгоритм логического И-НЕ , реализованный электронным способом в микросхеме 7400
Примеры блок-схем канонических структур Бема-Якопини : ПОСЛЕДОВАТЕЛЬНОСТЬ (прямоугольники, спускающиеся по странице), ПОКА-ДЕЛАТЬ и ЕСЛИ-ТО-ИНАЧЕ. Эти три структуры состоят из примитивного условного GOTO ( IF test THEN GOTO step xxx, показан ромбом), безусловного GOTO (прямоугольник), различных операторов присваивания (прямоугольник) и HALT (прямоугольник). Вложение этих структур внутрь блоков присваивания приводит к сложным диаграммам (ср. Tausworthe 1977:100, 114).

В компьютерных системах алгоритм — это, по сути, пример логики, написанной в программном обеспечении разработчиками программного обеспечения, чтобы быть эффективным для предполагаемого «целевого» компьютера (ов) для получения вывода из заданного (возможно, нулевого) ввода . Оптимальный алгоритм, даже работающий на старом оборудовании, будет давать более быстрые результаты, чем неоптимальный (с более высокой временной сложностью ) алгоритм для той же цели, работающий на более эффективном оборудовании; именно поэтому алгоритмы, как и компьютерное оборудование, считаются технологиями.

«Элегантные» (компактные) программы, «хорошие» (быстрые) программы . Понятие «простота и элегантность» неформально появляется у Кнута и именно у Чайтина :

Кнут: «… нам нужны хорошие алгоритмы в каком-то нечетко определенном эстетическом смысле. Один критерий… это время, необходимое для выполнения алгоритма…. Другими критериями являются адаптируемость алгоритма к компьютерам, его простота и элегантность и т. д.» [39]
Чайтин: «...программа 'изящна', под которой я подразумеваю, что это наименьшая возможная программа для получения того результата, который она делает» [40] .

Чайтин предваряет свое определение словами: «Я покажу, что вы не можете доказать, что программа «изящна » » — такое доказательство решило бы проблему остановки (там же).

Алгоритм против функции, вычисляемой алгоритмом : для данной функции может существовать несколько алгоритмов. Это верно даже без расширения доступного программисту набора инструкций. Роджерс замечает, что «... важно различать понятие алгоритма , т. е. процедуры, и понятие функции, вычисляемой с помощью алгоритма , т. е. отображения, полученного с помощью процедуры. Одна и та же функция может иметь несколько разных алгоритмов». [41]

К сожалению, может быть компромисс между совершенством (скоростью) и элегантностью (компактностью) — элегантная программа может выполнять больше шагов для завершения вычислений, чем менее элегантная. Ниже приведен пример, использующий алгоритм Евклида.

Компьютеры (и компьютеры), модели вычислений : Компьютер (или человеческий «компьютер» [42] ) — это машина ограниченного типа, «дискретное детерминированное механическое устройство» [43] , которое слепо следует своим инструкциям. [44] Примитивные модели Мелзака и Ламбека [45] свели это понятие к четырем элементам: (i) дискретные, различимые местоположения , (ii) дискретные, неразличимые счетчики [46] (iii) агент и (iv) список инструкций которые эффективны относительно возможностей агента. [47]

Мински описывает более подходящую вариацию модели «счетов» Ламбека в его «Очень простых основах вычислимости ». [48] Машина Мински последовательно выполняет свои пять (или шесть, в зависимости от того, как считать) инструкций, если только условный IF-THEN GOTO или безусловный GOTO не изменяет ход выполнения программы вне последовательности. Помимо HALT, машина Мински включает три операции присваивания (замены, подстановки) [49] : НУЛЬ (например, содержимое ячейки заменено на 0: L ← 0), ПОСЛЕДОВАТЕЛЬ (например, L ← L+1) и УМЕНЬШЕНИЕ (например, L ← л - 1). [50] Программисту редко приходится писать «код» с таким ограниченным набором инструкций.Но Минский показывает (как и Мелзак и Ламбек), что его машинаВ комплекте Тьюринга всего четыре основных типа инструкций: условный GOTO, безусловный GOTO, присваивание/замена/подстановка и HALT. Однако для полноты по Тьюрингу также требуется несколько различных инструкций присваивания (например, DECREMENT, INCREMENT и ZERO/CLEAR/EMPTY для машины Мински); их точная спецификация зависит от дизайнера. Безусловный GOTO удобен; он может быть построен путем инициализации выделенной ячейки нулями, например, командой «Z ← 0»; после этого инструкция IF Z=0 THEN GOTO xxx является безусловной.

Моделирование алгоритма: компьютерный (компьютерный) язык : Кнут советует читателю, что «лучший способ изучить алгоритм — это попробовать его... немедленно взять ручку и бумагу и проработать пример». [51] А как насчет симуляции или исполнения реальной вещи? Программист должен перевести алгоритм на язык, который симулятор/компьютер/компьютер может эффективно выполнять. Стоун приводит пример этого: при вычислении корней квадратного уравнения вычислитель должен знать, как извлечь квадратный корень. Если они этого не делают, то алгоритм, чтобы быть эффективным, должен обеспечивать набор правил для извлечения квадратного корня. [52]

Это означает, что программист должен знать «язык», эффективный по отношению к целевому вычислительному агенту (компьютер/компьютер).

Но какую модель следует использовать для моделирования? Ван Эмде Боас отмечает, что «даже если мы основываем теорию сложности на абстрактных, а не на конкретных машинах, остается произвол в выборе модели. Именно в этот момент появляется понятие симуляции ». [53] При измерении скорости набор инструкций имеет значение. Например, подпрограмма в алгоритме Евклида для вычисления остатка выполнялась бы намного быстрее, если бы у программиста была доступна инструкция « модуля », а не просто вычитание (или, что еще хуже, просто «декремент» Минского).

Структурированное программирование, канонические структуры : согласно тезису Черча-Тьюринга , любой алгоритм может быть рассчитан с помощью модели, известной как полная по Тьюрингу , и, согласно демонстрации Мински, для полноты по Тьюрингу требуется только четыре типа инструкций: условный GOTO, безусловный GOTO, присваивание, HALT. Кемени и Курц отмечают, что, хотя «недисциплинированное» использование безусловных GOTO и условных IF-THEN GOTO может привести к « спагетти-коду », программист может писать структурированные программы, используя только эти инструкции; с другой стороны, «также возможно и не слишком сложно писать плохо структурированные программы на структурированном языке».[54] Таусворт дополняет три канонические структуры Бема-Якопини :[55] SEQUENCE, IF-THEN-ELSE и WHILE-DO, а также еще два: DO-WHILE и CASE. [56] Дополнительным преимуществом структурированной программы является то, что она поддается доказательству правильности с использованием математической индукции . [57]

Канонические символы блок -схемы [58] : Графический помощник, называемый блок -схемой , предлагает способ описания и документирования алгоритма (и его компьютерной программы). Подобно потоку программы машины Мински, блок-схема всегда начинается вверху страницы и продолжается вниз. Его основных символов всего четыре: направленная стрелка, показывающая ход программы, прямоугольник (SEQUENCE, GOTO), ромб (IF-THEN-ELSE) и точка (OR-галстук). Канонические структуры Бема-Якопини состоят из этих примитивных форм. Подконструкции могут «вкладываться» в прямоугольники, но только если из надстройки имеется единственный выход. Символы и их использование для построения канонических структур показаны на диаграмме.

Примеры

Пример алгоритма

Один из простейших алгоритмов — найти наибольшее число в списке чисел случайного порядка. Чтобы найти решение, нужно просмотреть каждое число в списке. Отсюда следует простой алгоритм, который можно изложить в высокоуровневом описании английской прозой так:

Описание высокого уровня:

  1. Если в наборе нет чисел, то нет и самого большого числа.
  2. Предположим, что первое число в наборе является самым большим числом в наборе.
  3. Для каждого оставшегося числа в наборе: если это число больше, чем текущее наибольшее число, считается, что это число является наибольшим числом в наборе.
  4. Когда в наборе не осталось чисел для перебора, считается, что текущее наибольшее число является наибольшим числом в наборе.

(Квази-)формальное описание: Написанное прозой, но гораздо более близкое к языку высокого уровня компьютерной программы, следующее представляет собой более формальное кодирование алгоритма в псевдокоде или пиджин-коде :

Алгоритм _ Вход: список чисел L . Выход: самое большое число в списке L .
 если  L.size = 0 вернуть значение null по величинеL [0] для каждого  элемента  в  L , сделать ,  если  элемент > по величине , то  по величинеэлемент  вернуть  по величине
  • « ← » обозначает присваивание . Например, « самый большойэлемент » означает, что значение самого большого изменяется на значение элемента .
  • " return " завершает алгоритм и выводит следующее значение.

Алгоритм Евклида

В математике алгоритм Евклида или алгоритм Евклида является эффективным методом вычисления наибольшего общего делителя (НОД) двух целых чисел (чисел), наибольшего числа, на которое они оба делятся без остатка . Он назван в честь древнегреческого математика Евклида , впервые описавшего его в своих « Началах » (ок. 300 г. до н. э.). [59] Это один из старейших широко используемых алгоритмов. Его можно использовать для приведения дробей к их простейшей форме , и он является частью многих других теоретико-числовых и криптографических вычислений.

Пример-диаграмма алгоритма Евклида из TL Heath (1908 г.) с добавлением дополнительных деталей. Евклид не идет дальше третьего измерения и не дает числовых примеров. Никомах приводит пример 49 и 21: «Я вычитаю меньшее из большего; остается 28; потом опять вычитаю из этого то же самое 21 (ибо это возможно); остается 7; я вычитаю это из 21, 14 есть влево; из которого я снова вычитаю 7 (ибо это возможно); 7 остается, но 7 нельзя вычесть из 7». Хит комментирует: «Последняя фраза любопытна, но ее значение достаточно очевидно, как и значение фразы об окончании «одним и тем же числом»» (Heath 1908: 300).

Евклид ставит задачу так: «Для двух чисел, не простых друг другу, найти их наибольшую общую меру». Он определяет «число [быть] множеством, состоящим из единиц»: счетное число, положительное целое число, не включающее ноль. «Измерить» — значит поместить более короткую измерительную длину s последовательно ( q раз) вдоль большей длины l до тех пор, пока оставшаяся часть r не станет меньше, чем более короткая длина s . [60] Говоря современным языком, остаток r = lq × s , q — частное, или остаток r- "модуль", целочисленная дробная часть, оставшаяся после деления. [61]

Чтобы метод Евклида был успешным, начальные длины должны удовлетворять двум требованиям: (i) длины не должны быть равны нулю, И (ii) вычитание должно быть «правильным»; т. е. тест должен гарантировать, что меньшее из двух чисел вычитается из большего (или два могут быть равны, так что их вычитание дает ноль).

Первоначальное доказательство Евклида добавляет третье требование: две длины не должны быть простыми друг к другу. Евклид оговорил это, чтобы он мог построить доведение до абсурда доказательство того, что общая мера двух чисел на самом деле является наибольшей . [62] Хотя алгоритм Никомаха такой же, как у Евклида, когда числа являются простыми друг к другу, он дает число «1» для их общей меры. Так что, если быть точным, следующий алгоритм действительно принадлежит Никомаху.

Графическое выражение алгоритма Евклида для нахождения наибольшего общего делителя для чисел 1599 и 650.
1599 = 650×2 + 299 650 = 299×2 + 52 299 = 52×5 + 39 52 = 39×1 + 13 39 = 13×3 + 0

Компьютерный язык для алгоритма Евклида

Для выполнения алгоритма Евклида требуется всего несколько типов инструкций — некоторые логические проверки (условный переход), безусловный переход, присваивание (замена) и вычитание.

  • Местоположение обозначается заглавными буквами, например, S, A и т. д .
  • Различное количество (число) в локации записывается строчными буквами и (обычно) связано с названием локации. Например, ячейка L в начале может содержать число l = 3009.

Неэлегантная программа для алгоритма Евклида

«Неэлегантный» - это перевод версии алгоритма Кнута с остаточным циклом на основе вычитания, заменяющим его использование деления (или инструкции «модуля»). Взято из Кнут 1973: 2–4. В зависимости от двух чисел «Неэлегантный» может вычислить НОД за меньшее количество шагов, чем «Элегантный».

Следующий алгоритм оформлен как четырехшаговая версия алгоритма Евклида и Никомаха Кнута, но вместо использования деления для нахождения остатка он использует последовательное вычитание меньшей длины s из оставшейся длины r до тех пор, пока r не станет меньше s . Высокоуровневое описание, выделенное жирным шрифтом, взято из Knuth 1973:2–4:

ВВОД :

1 [В двух местах L и S поместите числа l и s , которые обозначают две длины]: ВХОД Л, С2 [Инициализировать R: сделать оставшуюся длину r равной начальной/начальной/входной длине l ]: Р ← Л

E0: [Убедитесь, что rs .]

3 [Убедитесь, что меньшее из двух чисел находится в S, а большее в R]: ЕСЛИ R > S, ТО содержимое L — это большее число, поэтому пропустите шаги обмена 4 , 5 и 6 : ПЕРЕЙТИ к шагу 7 ЕЩЕ поменять местами содержимое R и S.4 L ← R (этот первый шаг избыточен, но полезен для дальнейшего обсуждения).5 Р ← С6 С ← Л

E1: [Найти остаток] : до тех пор, пока оставшаяся длина r в R не станет меньше, чем более короткая длина s в S, несколько раз вычтите измеренное число s в S из оставшейся длины r в R.

7 ЕСЛИ S > R ТО сделал измерения так ПЕРЕЙТИ К 10 ЕЩЕ еще раз измерить,8 Р ← Р - С9 [Остаток цикла]: ПЕРЕЙТИ К 7 .

E2: [Остаток равен нулю?] : ЛИБО (i) последняя мера была точной, остаток в R равен нулю, и программа может остановиться, ИЛИ (ii) алгоритм должен продолжаться: последняя мера оставила остаток в R меньше, чем число измерения в S.

10 ЕСЛИ R = 0 ТО сделано так ПЕРЕЙТИ к шагу 15 ЕЩЕ ПЕРЕЙДИТЕ К шагу 11 ,

E3: [Поменять местами s и r ] : орех алгоритма Евклида. Используйте остаток r , чтобы измерить то, что раньше было меньшим числом s ; L служит временным местом.

11 Л ← П12 Р ← С13 С ← Л14 [Повторите процесс измерения]: ПЕРЕЙТИ К 7

ВЫВОД :

15 [Готово. S содержит наибольший общий делитель ]: ПЕЧАТЬ С

СДЕЛАНО :

16 ОСТАНОВКА, КОНЕЦ, СТОП.

Элегантная программа для алгоритма Евклида

В следующей версии алгоритма Евклида требуется всего шесть основных инструкций, чтобы сделать то, что тринадцать требуется для «Неэлегантного»; хуже того, "Неэлегантный" требует больше типов инструкций. [ уточнить ] Блок-схему «Элегант» можно найти вверху этой статьи. В (неструктурированном) языке Basic шаги пронумерованы, а инструкция — это инструкция присваивания, обозначенная знаком ←.LET [] = []

 5  REM Алгоритм Евклида для нахождения наибольшего общего делителя  6  PRINT  "Введите два целых числа больше 0"  10  ВВОД  A , B  20  ЕСЛИ  B = 0 ,  ТОГДА  ПЕРЕЙТИ К  80  30  ЕСЛИ  A  >  B ,  ТОГДА  ПЕРЕЙТИ К  60  40  ПУСТЬ  B = B - A  50  ПЕРЕЙТИ К  20  60  ПУСТЬ  A = A - B  70  ПЕРЕЙТИ  20  80  ПЕЧАТЬ  A  90  КОНЕЦ

Как работает «Elegant» : вместо внешней «петли Евклида» «Elegant» перемещается туда и обратно между двумя «совместными циклами», циклом A > B, который вычисляет A ← A − B, и циклом B ≤ A. который вычисляет B ← B − A. Это работает, потому что, когда, наконец, уменьшаемое M меньше или равно вычитаемому S (Разность = уменьшаемое − вычитаемое), уменьшаемое может стать s (новая длина измерения), а вычитаемое может стать новым r (длина, которую нужно измерить); другими словами, «смысл» вычитания меняется на противоположный.

Следующая версия может использоваться с языками программирования из семейства C :

// Алгоритм Евклида для наибольшего общего делителя int  euclidAlgorithm  ( int  A ,  int  B ){  A = abs ( A );  B = абс ( B );  в то время как  ( B != 0 ) {  в то время как  ( A > B )  A знак равно A - B ;  В = В - А ;  }  вернуть  А ; }

Тестирование алгоритмов Евклида

Делает ли алгоритм то, что хочет его автор? Несколько тестов обычно дают некоторую уверенность в основных функциях. Но тестов недостаточно. Для тестов один источник [63] использует 3009 и 884. Кнут предложил 40902, 24140. Другой интересный случай — два относительно простых числа 14157 и 5950.

Но «исключительные случаи» [64] должны быть выявлены и проверены. Будет ли «Неэлегантно» работать правильно, когда R > S, S > R, R = S? То же самое для «Элегантного»: B > A, A > B, A = B? (Да для всех). Что происходит, когда одно число равно нулю, оба числа равны нулю? («Неэлегантный» вычисляет навсегда во всех случаях; «Элегантный» вычисляет навсегда, когда A = 0.) Что произойдет, если будут введены отрицательные числа? Дробные числа? Если входные числа, т. е. область определения функции , вычисляемой алгоритмом/программой, должны включать только положительные целые числа, включая ноль,тогда сбои в нуле указывают на то, что алгоритм (и программа, которая реализует его) является частичной функцией , а не общей функцией .. Заметной неудачей из-за исключений является отказ ракеты Ariane 5 Flight 501 (4 июня 1996 г.).

Доказательство правильности программы с использованием математической индукции : Кнут демонстрирует применение математической индукции к «расширенной» версии алгоритма Евклида и предлагает «общий метод, применимый для доказательства правильности любого алгоритма». [65] Tausworthe предлагает, чтобы мерой сложности программы была длина доказательства ее корректности. [66]

Измерение и улучшение алгоритмов Евклида

Элегантность (компактность) и качество (скорость) : всего с шестью основными инструкциями «Элегантный» является явным победителем по сравнению с «Неэлегантным» с тринадцатью инструкциями. Однако «Неэлегантный» быстрее (он достигает HALT за меньшее количество шагов). Анализ алгоритма [67] показывает, почему это так: «Элегантный» выполняет две условные проверки в каждом цикле вычитания, тогда как «Неэлегантный» — только один. Поскольку алгоритм (обычно) требует много циклов, в среднем много времени тратится впустую на выполнение "B = 0?" тест, который необходим только после вычисления остатка.

Можно ли улучшить алгоритмы? : Как только программист оценивает программу как «подходящую» и «эффективную», то есть она вычисляет функцию, задуманную ее автором, возникает вопрос, можно ли ее улучшить?

Компактность «Неэлегантного» можно повысить, убрав пять ступеней. Но Чайтин доказал, что сжатие алгоритма нельзя автоматизировать с помощью обобщенного алгоритма; [68] скорее, это можно сделать только эвристически ; то есть путем исчерпывающего поиска (примеры можно найти на Busy beaver ), проб и ошибок, сообразительности, проницательности, применения индуктивных рассуждений и т. д . Обратите внимание, что шаги 4, 5 и 6 повторяются в шагах 11, 12 и 13. Сравнение с «Элегантный» намекает на то, что эти шаги вместе с шагами 2 и 3 можно исключить. Это уменьшает количество основных инструкций с тринадцати до восьми, что делает его «более элегантным», чем «Elegant», с девятью шагами.

Скорость «Элеганта» можно улучшить, переместив «B=0?» тест вне двух петель вычитания. Это изменение требует добавления трех инструкций (B = 0?, A = 0?, GOTO). Теперь "Elegant" быстрее вычисляет номера примеров; всегда ли это имеет место для любых данных A, B и R, S, потребовал бы подробного анализа.

Алгоритмический анализ

Часто важно знать, сколько определенного ресурса (например, времени или памяти) теоретически требуется для данного алгоритма. Разработаны методы анализа алгоритмов получения таких количественных ответов (оценок); например, алгоритм, который суммирует элементы списка из n чисел, потребует времени O(n) при использовании большой нотации O. Алгоритму всегда нужно помнить только два значения: сумму всех элементов на данный момент и его текущую позицию во входном списке. Следовательно, говорят, что требуется пространство O(1) , если пространство, необходимое для хранения входных чисел, не подсчитывается, или O(n) , если оно подсчитывается.

Разные алгоритмы могут выполнять одну и ту же задачу с другим набором инструкций за меньшее или большее время, пространство или « усилия », чем другие. Например, алгоритм бинарного поиска (со стоимостью O(log n) ) превосходит последовательный поиск (стоимостью O(n) ) при использовании для поиска в таблице в отсортированных списках или массивах.

Формальный против эмпирического

Анализ и изучение алгоритмов является дисциплиной компьютерных наук и часто практикуется абстрактно без использования определенного языка программирования или реализации. В этом смысле анализ алгоритмов напоминает другие математические дисциплины, поскольку он фокусируется на основных свойствах алгоритма, а не на специфике какой-либо конкретной реализации. Обычно для анализа используется псевдокод , так как это наиболее простое и общее представление. Однако, в конечном счете, большинство алгоритмов обычно реализуются на конкретных аппаратно-программных платформах, и их алгоритмическая эффективность невелика.в конечном итоге подвергается испытанию с использованием реального кода. Для решения «одноразовой» проблемы эффективность конкретного алгоритма может не иметь значительных последствий (если только n не является чрезвычайно большим), но для алгоритмов, разработанных для быстрого интерактивного, коммерческого или длительного научного использования, это может быть критично. Масштабирование от малого n к большому n часто выявляет неэффективные алгоритмы, которые в остальном безобидны.

Эмпирическое тестирование полезно, поскольку оно может выявить неожиданные взаимодействия, влияющие на производительность. Контрольные показатели могут использоваться для сравнения до и после возможных улучшений алгоритма после оптимизации программы. Однако эмпирические тесты не могут заменить формальный анализ и не являются тривиальными для честного выполнения. [69]

Эффективность исполнения

Чтобы проиллюстрировать потенциальные улучшения, возможные даже в хорошо зарекомендовавших себя алгоритмах, недавняя важная инновация, относящаяся к алгоритмам БПФ (интенсивно используемым в области обработки изображений), может сократить время обработки до 1000 раз для таких приложений, как медицинская визуализация. [70] Как правило, повышение скорости зависит от особых свойств задачи, которые очень распространены в практических приложениях. [71] Ускорение такого масштаба позволяет вычислительным устройствам, широко использующим обработку изображений (например, цифровым камерам и медицинскому оборудованию), потреблять меньше энергии.

Классификация

Существуют различные способы классификации алгоритмов, каждый из которых имеет свои достоинства.

По реализации

Один из способов классификации алгоритмов — по средствам реализации.

Рекурсия
Рекурсивный алгоритм — это алгоритм, который многократно вызывает (ссылается) сам на себя до тех пор, пока не совпадет определенное условие (также известное как условие завершения), что является методом, общим для функционального программирования . Итерационные алгоритмы используют повторяющиеся конструкции, такие как циклы, а иногда и дополнительные структуры данных, такие как стеки , для решения поставленных задач. Некоторые задачи естественным образом подходят для той или иной реализации. Например, башни Ханоя хорошо понимаются с помощью рекурсивной реализации. Каждая рекурсивная версия имеет эквивалентную (но, возможно, более или менее сложную) итеративную версию, и наоборот.
Логический
Алгоритм можно рассматривать как управляемый логический вывод . Это понятие можно выразить так: Алгоритм = логика + управление . [72] Логический компонент выражает аксиомы, которые могут использоваться в вычислениях, а управляющий компонент определяет способ применения вывода к аксиомам. Это основа парадигмы логического программирования . В языках программирования с чистой логикой компонент управления фиксирован, а алгоритмы задаются только логическим компонентом. Привлекательность этого подхода заключается в элегантной семантике : изменение аксиом приводит к четко определенным изменениям в алгоритме.
Последовательный, параллельный или распределенный
Алгоритмы обычно обсуждаются с предположением, что компьютеры выполняют одну инструкцию алгоритма за раз. Эти компьютеры иногда называют последовательными компьютерами. Алгоритм , разработанный для такой среды, называется последовательным алгоритмом, в отличие от параллельных алгоритмов или распределенных алгоритмов . Параллельные алгоритмы используют преимущества компьютерных архитектур, в которых несколько процессоров могут работать над задачей одновременно, тогда как распределенные алгоритмы используют несколько машин, подключенных к компьютерной сети .. Параллельные или распределенные алгоритмы делят проблему на более симметричные или асимметричные подзадачи и собирают результаты вместе. Потребление ресурсов в таких алгоритмах — это не только процессорные циклы на каждом процессоре, но и накладные расходы на обмен данными между процессорами. Некоторые алгоритмы сортировки могут быть эффективно распараллелены, но их коммуникационные накладные расходы являются дорогостоящими. Итерационные алгоритмы обычно распараллеливаемы. Некоторые задачи не имеют параллельных алгоритмов и называются последовательными задачами.
Детерминированный или недетерминированный
Детерминистические алгоритмы решают задачу с точным решением на каждом шаге алгоритма, тогда как недетерминированные алгоритмы решают задачи путем угадывания, хотя типичные догадки становятся более точными за счет использования эвристики .
Точное или приблизительное
В то время как многие алгоритмы достигают точного решения, алгоритмы аппроксимации ищут приближение, которое ближе к истинному решению. Аппроксимация может быть достигнута либо с использованием детерминированной, либо случайной стратегии. Такие алгоритмы имеют практическое значение для решения многих сложных задач. Одним из примеров приближенного алгоритма является задача о рюкзаке , где имеется множество заданных предметов. Его цель - упаковать рюкзак, чтобы получить максимальную общую стоимость. Каждый предмет имеет некоторый вес и некоторую ценность. Общий вес, который можно нести, не превышает некоторого фиксированного числа X. Таким образом, решение должно учитывать вес предметов, а также их стоимость. [73]
Квантовый алгоритм
Они работают на реалистичной модели квантовых вычислений . Этот термин обычно используется для тех алгоритмов, которые кажутся квантовыми по своей сути или используют некоторые существенные особенности квантовых вычислений , такие как квантовая суперпозиция или квантовая запутанность .

По парадигме дизайна

Другой способ классификации алгоритмов — по методологии их разработки или парадигме . Существует определенное количество парадигм, каждая из которых отличается от другой. Кроме того, каждая из этих категорий включает множество различных типов алгоритмов. Некоторые распространенные парадигмы:

Полный перебор или полный перебор
Это наивный метод пробовать все возможные решения, чтобы найти лучшее. [74]
Разделяй и властвуй
Алгоритм « разделяй и властвуй » неоднократно сводит экземпляр проблемы к одному или нескольким более мелким экземплярам той же проблемы (обычно рекурсивно ), пока экземпляры не станут достаточно малы, чтобы их можно было легко решить. Одним из таких примеров «разделяй и властвуй» является сортировка слиянием . Сортировка может быть выполнена для каждого сегмента данных после разделения данных на сегменты, а сортировка всех данных может быть получена на этапе завоевания путем слияния сегментов. Более простой вариант «разделяй и властвуй» называется алгоритмом « убавляй и властвуй »., который решает идентичную подзадачу и использует решение этой подзадачи для решения большей проблемы. Разделяй и властвуй разделяет проблему на несколько подзадач, поэтому этап завоевания более сложен, чем алгоритмы уменьшения и завоевания. Примером алгоритма уменьшения и завоевания является алгоритм бинарного поиска .
Поиск и перечисление
Многие задачи (например, игра в шахматы ) могут быть смоделированы как задачи на графах . Алгоритм исследования графа задает правила перемещения по графу и полезен для таких задач. В эту категорию также входят алгоритмы поиска , перечисление ветвей и границ и поиск с возвратом .
Рандомизированный алгоритм
Такие алгоритмы делают выбор случайно (или псевдослучайно). Они могут быть очень полезны при поиске приближенных решений для задач, где поиск точных решений может оказаться нецелесообразным (см. эвристический метод ниже). Для некоторых из этих задач известно, что самые быстрые приближения должны включать некоторую случайность . [75] Могут ли рандомизированные алгоритмы с полиномиальной временной сложностью быть самыми быстрыми алгоритмами для некоторых задач — открытый вопрос, известный как проблема P и NP . Существует два больших класса таких алгоритмов:
  1. Алгоритмы Монте-Карло возвращают правильный ответ с высокой вероятностью. Например , RP является подклассом тех, которые выполняются за полиномиальное время .
  2. Алгоритмы Лас-Вегаса всегда возвращают правильный ответ, но время их работы ограничено только вероятностно, например, ZPP .
Снижение сложности
Этот метод включает в себя решение сложной проблемы путем преобразования ее в более известную проблему, для которой у нас есть (надеюсь) асимптотически оптимальные алгоритмы. Цель состоит в том, чтобы найти редукционный алгоритм, сложность которого не зависит от итогового редуцированного алгоритма. Например, один из алгоритмов выбора для нахождения медианы в несортированном списке включает в себя сначала сортировку списка (дорогая часть), а затем извлечение среднего элемента из отсортированного списка (дешевая часть). Эта техника также известна как трансформация и завоевание .
Обратное отслеживание
При таком подходе несколько решений создаются постепенно и от них отказываются, когда выясняется, что они не могут привести к действительному полному решению.

Проблемы с оптимизацией

Для задач оптимизации существует более конкретная классификация алгоритмов; алгоритм решения таких задач может относиться к одной или нескольким общим категориям, описанным выше, а также к одной из следующих:

Линейное программирование
При поиске оптимальных решений линейной функции, связанной линейными ограничениями равенства и неравенства, ограничения задачи могут использоваться непосредственно для получения оптимальных решений. Существуют алгоритмы, способные решить любую задачу из этой категории, например популярный симплексный алгоритм . [76] Проблемы, которые можно решить с помощью линейного программирования, включают задачу о максимальном потоке для ориентированных графов. Если задача дополнительно требует, чтобы одно или несколько неизвестных были целыми числами , то она классифицируется как целочисленное программирование .. Алгоритм линейного программирования может решить такую ​​задачу, если можно доказать, что все ограничения для целочисленных значений являются поверхностными, т. е. решения в любом случае удовлетворяют этим ограничениям. В общем случае используется специализированный алгоритм или алгоритм, находящий приближенные решения, в зависимости от сложности задачи.
Динамическое программирование
Когда проблема имеет оптимальные подструктуры — это означает, что оптимальное решение проблемы может быть построено из оптимальных решений подзадач — и перекрывающиеся подзадачи , то есть одни и те же подзадачи используются для решения многих разных экземпляров проблемы, более быстрый подход, называемый динамическим программированием , позволяет избежать повторного вычисления решений, которые уже вычислены. Например, в алгоритме Флойда-Уоршалла кратчайший путь к цели из вершины во взвешенном графе можно найти, используя кратчайший путь к цели из всех соседних вершин. Динамическое программирование и запоминаниеидти вместе. Основное различие между динамическим программированием и разделяй и властвуй состоит в том, что в разделяй и властвуй подзадачи более или менее независимы, тогда как в динамическом программировании подзадачи перекрываются. Разница между динамическим программированием и простой рекурсией заключается в кэшировании или запоминании рекурсивных вызовов. Когда подзадачи независимы и нет повторения, запоминание не помогает; следовательно, динамическое программирование не является решением всех сложных проблем. Используя запоминание или поддерживая таблицу уже решенных подзадач, динамическое программирование снижает экспоненциальный характер многих задач до полиномиальной сложности.
Жадный метод
Жадный алгоритм подобен алгоритму динамического программирования тем, что он работает, исследуя подструктуры, в данном случае не проблемы, а заданного решения. Такие алгоритмы начинают с некоторого решения, которое может быть задано или каким-то образом построено, и улучшают его, внося небольшие модификации. Для одних задач они могут найти оптимальное решение, а для других останавливаются на локальных оптимумах , то есть на решениях, которые не могут быть улучшены алгоритмом, но не являются оптимальными. Наиболее популярное использование жадных алгоритмов - это поиск минимального остовного дерева, где с помощью этого метода возможно найти оптимальное решение. Дерево Хаффмана , Крускал , Прим , Соллин являются жадными алгоритмами, которые могут решить эту задачу оптимизации.
Эвристический метод
В задачах оптимизации эвристические алгоритмы могут использоваться для поиска решения, близкого к оптимальному, в тех случаях, когда поиск оптимального решения нецелесообразен. Эти алгоритмы работают, приближаясь к оптимальному решению по мере их продвижения. В принципе, если запускать бесконечное количество времени, они найдут оптимальное решение. Их заслуга в том, что они могут найти решение, очень близкое к оптимальному, за относительно короткое время. К таким алгоритмам относятся локальный поиск , запретный поиск , имитация отжига и генетические алгоритмы .. Некоторые из них, такие как имитация отжига, являются недетерминированными алгоритмами, тогда как другие, такие как запретный поиск, являются детерминированными. Когда известна граница ошибки неоптимального решения, алгоритм далее классифицируется как алгоритм аппроксимации .

По области обучения

Каждая область науки имеет свои проблемы и нуждается в эффективных алгоритмах. Связанные проблемы в одной области часто изучаются вместе. Некоторыми примерами классов являются алгоритмы поиска , алгоритмы сортировки , алгоритмы слияния , численные алгоритмы , графовые алгоритмы , строковые алгоритмы , вычислительные геометрические алгоритмы , комбинаторные алгоритмы , медицинские алгоритмы , машинное обучение , криптография , алгоритмы сжатия данных и методы синтаксического анализа .

Области, как правило, перекрываются друг с другом, и прогресс алгоритма в одной области может улучшить работу других, иногда совершенно не связанных друг с другом областей. Например, динамическое программирование было изобретено для оптимизации потребления ресурсов в промышленности, но сейчас используется для решения широкого круга задач во многих областях.

По сложности

Алгоритмы можно классифицировать по количеству времени, которое им необходимо для завершения, по сравнению с размером их входных данных:

  • Постоянное время: если время, необходимое алгоритму, одинаково, независимо от размера ввода. Например, доступ к элементу массива .
  • Логарифмическое время: если время является логарифмической функцией размера ввода. Например , алгоритм бинарного поиска .
  • Линейное время: если время пропорционально размеру ввода. Например, обход списка.
  • Полиномиальное время: если время является степенью входного размера. Например, алгоритм пузырьковой сортировки имеет квадратичную временную сложность.
  • Экспоненциальное время: если время является экспоненциальной функцией размера ввода. Например , поиск методом грубой силы .

Некоторые задачи могут иметь несколько алгоритмов разной сложности, в то время как другие задачи могут не иметь алгоритмов или не иметь известных эффективных алгоритмов. Есть также отображения от одних проблем к другим проблемам. В связи с этим оказалось более целесообразным классифицировать сами задачи, а не алгоритмы, по классам эквивалентности на основе сложности наилучших возможных для них алгоритмов.

Непрерывные алгоритмы

Прилагательное «непрерывный» применительно к слову «алгоритм» может означать:

  • Алгоритм, работающий с данными, представляющими непрерывные величины, даже если эти данные представлены дискретными приближениями, — такие алгоритмы изучаются в численном анализе ; или
  • Алгоритм в виде дифференциального уравнения , непрерывно работающий с данными, работающий на аналоговом компьютере . [77]

Юридические проблемы

Алгоритмы сами по себе обычно не подлежат патентованию. В Соединенных Штатах заявление, состоящее исключительно из простых манипуляций с абстрактными понятиями, числами или сигналами, не является «процессом» (USPTO 2006), и, следовательно, алгоритмы не подлежат патентованию (как в деле Gottschalk v. Benson ). Однако практическое применение алгоритмов иногда патентоспособно. Например, в деле Даймонд против Диера применение простого алгоритма обратной связи для облегчения отверждения синтетического каучука было признано патентоспособным. Патентование программного обеспечения вызывает большие споры, и есть сильно критикуемые патенты, связанные с алгоритмами, особенно алгоритмами сжатия данных , такими как Unisys.« Патент LZW .

Кроме того, некоторые криптографические алгоритмы имеют ограничения на экспорт (см. экспорт криптографии ).

История: Развитие понятия «алгоритм».

Древний Ближний Восток

Самые ранние свидетельства существования алгоритмов можно найти в вавилонской математике древней Месопотамии (современный Ирак). Шумерская глиняная табличка, найденная в Шуруппаке близ Багдада и датированная примерно 2500 г. до н.э., описывает самый ранний алгоритм деления . [10] Во времена династии Хаммурапи, около 1800-1600 гг. до н.э., вавилонские глиняные таблички описывали алгоритмы вычисления формул . [78] Алгоритмы также использовались в вавилонской астрономии.. Вавилонские глиняные таблички описывают и используют алгоритмические процедуры для вычисления времени и места значительных астрономических событий. [79]

Алгоритмы арифметики также встречаются в древнеегипетской математике , восходящей к математическому папирусу Райнда около 1550 г. до н.э. [10] Позднее алгоритмы использовались в древней эллинистической математике . Двумя примерами являются Решето Эратосфена , которое было описано во « Введении в арифметику » Никомаха , [80] [11] : гл. 9.2  , и алгоритм Евклида , впервые описанный в «Элементах» Евклида (ок. 300 г. до н.э.). [11] : Гл. 9.1 

Дискретные и различимые символы

Метки: Чтобы вести учет своих стад, мешков с зерном и денег, древние использовали подсчет: собирая камни или отметки, нацарапанные на палках, или делая дискретные символы на глине. Благодаря использованию знаков и символов вавилонянами и египтянами в конечном итоге появились римские цифры и счеты (Дилсон, стр. 16–41). Метки подсчета занимают видное место в арифметике унарной системы счисления, используемой в вычислениях на машине Тьюринга и машине Пост-Тьюринга .

Манипуляции с символами как «заполнителями» для чисел: алгебра

Мухаммад ибн Муса аль-Хорезми , персидский математик , написал Аль-Джабр в 9 веке. Термины « алгоритм » и «алгоритм» происходят от имени аль-Хорезми, а термин « алгебра » происходит от книги Аль-джабр . В Европе слово «алгоритм» первоначально использовалось для обозначения набора правил и методов, используемых Аль-Хорезми для решения алгебраических уравнений, а затем было обобщено для обозначения любого набора правил или методов. [81] Это в конечном итоге привело к понятию Лейбница о логическом исчислении (ок. 1680 г.):

На добрых полтора века раньше своего времени Лейбниц предложил алгебру логики, алгебру, которая определяла бы правила манипулирования логическими понятиями так же, как обычная алгебра определяет правила манипулирования числами. [82]

Криптографические алгоритмы

Первый криптографический алгоритм для расшифровки зашифрованного кода был разработан Аль-Кинди , арабским математиком 9 века , в «Рукописи по расшифровке криптографических сообщений» . Он дал первое описание криптоанализа с помощью частотного анализа , самого раннего алгоритма взлома кода . [12]

Механические устройства с дискретными состояниями

Часы : Болтер считает изобретение весовых часов «ключевым изобретением [Европы в Средние века]», в частности, спусковой механизм грани [83] , который дает нам тиканье механических часов. «Точная автоматическая машина» [84] немедленно привела к «механическим автоматам », начиная с 13 века, и, наконец, к «вычислительным машинам» — разностной машине и аналитическим машинам Чарльза Бэббиджа и графини Ады Лавлейс , середина 19 века. [85]Лавлейсу приписывают первое создание алгоритма, предназначенного для обработки на компьютере - аналитическая машина Бэббиджа, первое устройство, которое считается настоящим полным по Тьюрингу компьютером, а не просто калькулятором , - и в результате его иногда называют «первым программистом в истории». хотя полная реализация второго устройства Бэббидж будет реализована только спустя десятилетия после ее жизни.

Логические машины 1870 г. - «логические счеты» и «логическая машина» Стэнли Джевонса : техническая проблема заключалась в сокращении булевых уравнений, когда они представлены в форме, аналогичной тому, что сейчас известно как карты Карно . Джевонс (1880) сначала описывает простые «счеты» из «деревянных планок, снабженных булавками, устроенные так, что любая часть или класс [логических] комбинаций может быть выбрана механически… систему в полностью механическую форму и, таким образом, воплотили весь непрямой процесс вывода в том, что можно назвать логической машиной .«Его машина была оснащена «некоторыми подвижными деревянными стержнями» и «у основания была 21 клавиша, как у пианино [и т. Д.] ...». С помощью этой машины он мог анализировать « силлогизм или любой другой простой логический аргумент». [86]

Эту машину он продемонстрировал в 1870 году перед членами Королевского общества. [87] Однако другой логик Джон Венн в своей « Символической логике » 1881 года предвзято отнесся к этому усилию: «Я не слишком высоко оцениваю интерес или важность того, что иногда называют логическими машинами… мне кажется, что любые устройства, известные в настоящее время или которые могут быть обнаружены, действительно заслуживают названия логических машин»; подробнее см. в разделе Характеристики алгоритмов . Но чтобы не отставать, он также представил «схему, несколько аналогичную, как я понимаю, счетам профессора Джевона».... [И] [а] усиление, соответствующее логической машине профессора Джевонса, может быть описано следующее устройство. Я предпочитаю называть ее просто машиной логических диаграмм... но я полагаю, что она вполне может делать все, что можно разумно ожидать от любой логической машины» [88] .

Жаккардовый ткацкий станок, перфокарты Холлерита, телеграфия и телефония - электромеханическое реле : Белл и Ньюэлл (1971) указывают, что жаккардовый ткацкий станок (1801 г.), предшественник карт Холлерита (перфокарты, 1887 г.), и «технологии коммутации телефонов» были корнями. дерева, приведшего к созданию первых компьютеров. [89] К середине 19 века телеграф , предшественник телефона, использовался во всем мире, его дискретное и различимое кодирование букв как «точки и тире» было обычным звуком. К концу 19 века использовалась тикерная лента (около 1870-х годов), как и карты Холлерита в переписи населения США 1890 года. Затем появился телетайп(ок. 1910 г.) с использованием перфоленты с кодом Бодо на ленте.

Телефонные коммутационные сети электромеханических реле (изобретены в 1835 г.) стояли за работой Джорджа Стибица (1937 г.), изобретателя цифрового счетного устройства. Работая в Bell Laboratories, он заметил «обременительное» использование механических калькуляторов с шестернями. «Однажды вечером в 1937 году он пошел домой, намереваясь проверить свою идею ... Когда возня была закончена, Штибиц сконструировал двоичное арифметическое устройство». [ 90]

Дэвис (2000) отмечает особую важность электромеханического реле (с его двумя «бинарными состояниями» — открытым и закрытым ):

Только с развитием, начиная с 1930-х годов, электромеханических калькуляторов, использующих электрические реле, были построены машины, обладающие возможностями, которые предвидел Бэббидж» [91] .

Математика в 19 веке до середины 20 века

Символы и правила . В быстрой последовательности математика Джорджа Буля (1847, 1854), Готлоба Фреге (1879) и Джузеппе Пеано (1888–1889) сводила арифметику к последовательности символов, управляемых правилами. Принципы арифметики Пеано , изложенные новым методом (1888 г.), были «первой попыткой аксиоматизации математики на символическом языке ». [92]

Но Хейеноорт отдает Фреге (1879) такую ​​похвалу: «Возможно, это самая важная работа Фреге, когда-либо написанная по логике... в которой мы видим «язык формул», то есть lingua characterica , язык, написанный с помощью специальных символов . , «для чистой мысли», то есть свободной от риторических украшений ... построенных из определенных символов, которыми манипулируют в соответствии с определенными правилами » . их Principia Mathematica (1910–1913).

Парадоксы : В то же время в литературе появился ряд тревожных парадоксов, в частности, парадокс Бурали-Форти (1897 г.), парадокс Рассела (1902–03 гг.) и парадокс Ричарда . [94] Результирующие соображения привели к статье Курта Гёделя (1931) — он специально цитирует парадокс лжеца — которая полностью сводит правила рекурсии к числам.

Эффективная вычислимость : в попытке решить Entscheidungsproblem , точно сформулированную Гильбертом в 1928 году, математики сначала приступили к определению того, что подразумевается под «эффективным методом», или «эффективным вычислением», или «эффективной вычислимостью» (т. ). В быстрой последовательности появилось следующее: λ-исчисление Алонзо Черча , Стивена Клини и Дж. Б. Россера [ 95] — точно отточенное определение «общей рекурсии» из работы Гёделя, действующее по предложениям Жака Эрбранда (ср. 1934) и последующие упрощения Клини. [96] Церковь'доказательство [97]что проблема Entscheidungsproblem неразрешима, определение Эмиля Поста эффективной расчетливости как рабочего, бездумно выполняющего список инструкций, чтобы двигаться влево или вправо через последовательность комнат и, находясь там, либо помечать, либо стирать бумагу, либо наблюдать за бумагой и делать да - нет решения о следующей инструкции. [98] Доказательство Аланом Тьюрингом того, что проблема Entscheidungsproblem неразрешима с помощью его «[автоматической] машины» [99] — по сути, почти идентично «формулировке» Поста, определению «эффективного метода » Дж. Баркли Россера . "в терминах "машина". [100] Предложение Клини предшественника « тезиса Чёрча », который он назвал «Тезис I», [101]а несколько лет спустя Клини переименовал свой тезис в «Тезис Черча» [102] и предложил «Тезис Тьюринга». [103]

Эмиль Пост (1936) и Алан Тьюринг (1936–37, 1939)

Эмиль Пост (1936) описал действия «компьютера» (человека) следующим образом:

«... задействованы два понятия: пространство символов , в котором должна выполняться работа, ведущая от проблемы к ответу, и фиксированный неизменный набор направлений .

Его пространство символов будет

«двусторонняя бесконечная последовательность пространств или ящиков… Решатель задач или рабочий должен двигаться и работать в этом символьном пространстве, имея возможность находиться и работать только в одном ящике за раз… ящик состоит в том, чтобы допустить только два возможных состояния, то есть быть пустым или немаркированным и иметь на нем одну метку, скажем, вертикальную черту.
«Одна клетка должна быть выделена и названа отправной точкой... конкретная задача должна быть задана в символической форме с помощью конечного числа ячеек [т. е. ВХОД], отмеченных штрихом. , ВЫВОД] должен быть задан в символической форме такой конфигурацией отмеченных прямоугольников...
«Набор направлений, применимых к общей проблеме, устанавливает детерминированный процесс применительно к каждой конкретной проблеме. Этот процесс завершается только тогда, когда речь идет о направлении типа (С) [т.е. СТОП]». [104] См. больше на машине Пост-Тьюринга .
Статуя Алана Тьюринга в Блетчли-парке

Работа Алана Тьюринга [105] предшествовала работе Стибица (1937); неизвестно, знал ли Штибиц о работе Тьюринга. Биограф Тьюринга полагал, что использование Тьюрингом модели, похожей на пишущую машинку, проистекает из юношеского интереса: «Алан мечтал изобрести пишущие машинки в детстве; у миссис Тьюринг была пишущая машинка, и он вполне мог начать с вопроса, что имелось в виду, когда он называл пишущая машинка «механическая». [106] Учитывая распространенность азбуки Морзе и телеграфии, бегущих строк и телетайпов, мы [ кто? ] мог бы предположить, что все они были влияниями.

Тьюринг — его модель вычислений теперь называется машиной Тьюринга — начинает, как и Пост, с анализа человеческого компьютера, который он сводит к простому набору основных движений и «состояний ума». Но он идет еще дальше и создает машину как модель вычисления чисел. [107]

«Вычисления обычно выполняются путем написания определенных символов на бумаге. Мы можем предположить, что эта бумага разделена на квадраты, как детская книга по арифметике… Тогда я предполагаю, что вычисления выполняются на одномерной бумаге, т. е. на ленте, разделенной на две части. на квадраты, я также предположу, что число символов, которые можно напечатать, конечно...
«Поведение компьютера в любой момент определяется символами, которые он наблюдает, и его «состоянием ума» в этот момент. Мы можем предположить, что существует граница B для числа символов или квадратов, которые компьютер может наблюдать в один момент. Если он хочет наблюдать больше, он должен использовать последовательные наблюдения. Мы также предположим, что число состояний ума, которые необходимо принять во внимание, конечно...
«Давайте представим, что операции, выполняемые компьютером, можно разделить на «простые операции», которые настолько элементарны, что их трудно представить далее разделенными». [108]

Сокращение Тьюринга дает следующее:

«Поэтому простые операции должны включать:
"(a) Изменения символа на одном из наблюдаемых квадратов
"(b) Изменения одного из наблюдаемых квадратов в другой квадрат в пределах L квадратов одного из ранее наблюдаемых квадратов.

«Возможно, что некоторые из этих изменений обязательно вызывают изменение состояния ума. Следовательно, самая общая операция должна быть принята как одна из следующих:

«(А) Возможное изменение (а) символа вместе с возможным изменением состояния ума.
«(B) Возможное изменение (b) наблюдаемых квадратов вместе с возможным изменением состояния сознания»
«Теперь мы можем построить машину, которая будет выполнять работу этого компьютера». [108]

Несколько лет спустя Тьюринг расширил свой анализ (тезис, определение) следующим убедительным его выражением:

«Говорят, что функция «эффективно вычислима», если ее значения могут быть найдены с помощью какого-либо чисто механического процесса. Хотя довольно легко понять эту идею интуитивно, тем не менее желательно иметь какое-то более определенное, математически выражаемое определение. ... [он обсуждает историю определения почти так же, как представлено выше в отношении Гёделя, Хербранда, Клини, Черча, Тьюринга и Поста] ... Мы можем понимать это утверждение буквально, понимая под чисто механическим процессом тот, который могут быть выполнены машиной. Можно дать математическое описание в некоторой нормальной форме структур этих машин. Развитие этих идей приводит к авторскому определению вычислимой функции и к отождествлению вычислимость † с эффективной вычислимостью ... .
«† Мы будем использовать выражение «вычислимая функция» для обозначения функции, вычисляемой машиной, и мы позволим «эффективно вычисляемой» относиться к интуитивной идее без особого отождествления с каким-либо из этих определений». [109]

Дж. Б. Россер (1939 г.) и С. К. Клини (1943 г.)

Дж. Баркли Россер определил «эффективный [математический] метод» следующим образом (курсив добавлен):

«Эффективный метод» используется здесь в довольно особом смысле метода, каждый шаг которого точно определен и который наверняка даст ответ за конечное число шагов. В этом особом значении были даны три различных точных определения. [его сноска № 5; см. обсуждение ниже]. Простейший из них (благодаря Посту и Тьюрингу) говорит, по существу, что эффективный метод решения определенных наборов проблем существует, если можно построить машину, которая затем решить любую проблему из набора без вмешательства человека, кроме как вставить вопрос и (позже) прочитать ответ. Все три определения эквивалентны, поэтому не имеет значения, какое из них используется. Более того, тот факт, что все три эквивалентны, является очень сильным аргументом в пользу правильности любого из них» (Rosser 1939: 225–226).

Сноска № 5 Россера ссылается на работу (1) Черча и Клини и их определение λ-определимости, в частности, на его использование Черчем в его «Неразрешимой проблеме элементарной теории чисел» (1936); (2) Хербранд и Гёдель и их использование рекурсии, в частности, использование Гёделем в его знаменитой статье « О формально неразрешимых предложениях Principia Mathematica и родственных систем I» (1931); и (3) Пост (1936) и Тьюринг (1936–37) в их механизированных моделях вычислений.

Стивен К. Клини определил как свой теперь известный «Тезис I», известный как тезис Черча-Тьюринга . Но он сделал это в следующем контексте (выделено жирным шрифтом в оригинале):

«12. Алгоритмические теории … При построении полной алгоритмической теории мы описываем процедуру, выполнимую для каждого набора значений независимых переменных, которая обязательно завершается и таким образом, чтобы из результата мы могли прочитать определенный ответ «да» или «нет» на вопрос «истинно ли значение предиката?» (Клин 1943: 273)

История после 1950 г.

Ряд усилий был направлен на дальнейшее уточнение определения «алгоритма», и работа продолжается из-за проблем, связанных, в частности, с основами математики (особенно тезисом Черча-Тьюринга ) и философией разума (особенно с аргументами об искусственном интеллекте ). Для получения дополнительной информации смотрите характеристики алгоритма .

Смотрите также

  • Абстрактная машина
  • Алгоритмическая инженерия
  • Характеристики алгоритма
  • Алгоритмический уклон
  • Алгоритмическая композиция
  • Алгоритмические объекты
  • Алгоритмический синтез
  • Алгоритмическая техника
  • Алгоритмическая топология
  • Мусор на входе, мусор на выходе
  • Введение в алгоритмы (учебник)
  • Список алгоритмов
  • Список общих тем алгоритма
  • Список важных публикаций по теоретической информатике - Алгоритмы
  • Регулирование алгоритмов
  • Теория вычислений
    • Теория вычислимости
    • Теория вычислительной сложности

Примечания

  1. ^ «Определение АЛГОРИТМА» . Онлайн-словарь Merriam-Webster . Архивировано из оригинала 14 февраля 2020 года . Проверено 14 ноября 2019 г. .
  2. Дэвид А. Гроссман, Офир Фридер, Поиск информации: алгоритмы и эвристика , 2-е издание, 2004 г., ISBN 1402030045 
  3. ^ «Например, любой классический математический алгоритм можно описать конечным числом английских слов» (Rogers 1987: 2).
  4. Хорошо определен в отношении агента, выполняющего алгоритм: «Существует вычислительный агент, обычно человек, который может реагировать на инструкции и выполнять вычисления» (Rogers 1987: 2).
  5. ^ «Алгоритм - это процедура вычисления функции (относительно некоторых выбранных обозначений целых чисел) ... это ограничение (числовыми функциями) не приводит к потере общности» (Rogers 1987: 1).
  6. ^ «Алгоритм имеет ноль или более входных данных, т . Е. Количество , которое дается ему изначально, прежде чем алгоритм запускается» (Кнут 1973: 5).
  7. ^ «Процедура, которая имеет все характеристики алгоритма, за исключением того, что ей, возможно, не хватает конечности, может быть названа« вычислительным методом » » (Кнут 1973: 5).
  8. ^ «Алгоритм имеет один или несколько выходных данных, то есть величин, которые имеют определенное отношение к входным данным» (Кнут 1973: 5).
  9. ^ Вопрос о том, является ли процесс со случайными внутренними процессами (не включая входные данные) алгоритмом, является спорным. Роджерс полагает, что «вычисления выполняются дискретным пошаговым способом, без использования непрерывных методов или аналоговых устройств ... переносятся детерминистически, без использования случайных методов или устройств, например, игральных костей» (Rogers 1987: 2) .
  10. ^ a b c Шабер, Жан-Люк (2012). История алгоритмов: от гальки до микрочипа . Springer Science & Business Media. стр. 7–8. ISBN 9783642181924.
  11. ^ a b c Кук, Роджер Л. (2005). История математики: краткий курс . Джон Уайли и сыновья. ISBN 978-1-118-46029-0.
  12. ^ a b Дули, Джон Ф. (2013). Краткая история криптологии и криптографических алгоритмов . Springer Science & Business Media. стр. 12–3. ISBN 9783319016283.
  13. ^ "Биография Аль-Хорезми" . www-history.mcs.st-andrews.ac.uk . Архивировано из оригинала 2 августа 2019 года . Проверено 3 мая 2017 г. .
  14. ^ "Этимология алгоритма" . Словарь Чемберса . Архивировано из оригинала 31 марта 2019 года . Проверено 13 декабря 2016 г.
  15. ^ Хогендейк, Ян П. (1998). «Аль-Хварзими» . Пифагор . 38 (2): 4–5. Архивировано из оригинала 12 апреля 2009 года.
  16. ^ Оукс, Джеффри А. «Был ли аль-Хорезми прикладным алгебраистом?» . Университет Индианаполиса . Архивировано из оригинала 18 июля 2011 года . Проверено 30 мая 2008 г.
  17. ^ Брезина, Корона (2006). Аль-Хорезми: изобретатель алгебры . Издательская группа Розен. ISBN 978-1-4042-0513-0.
  18. ↑ Важнейшие математические тексты в истории . Архивировано 9 июня 2011 г. в Wayback Machine , согласно Карлу Б. Бойеру .
  19. «algorismic» , The Free Dictionary , заархивировано из оригинала 21 декабря 2019 г., получено 14 ноября 2019 г.
  20. ^ Оксфордский словарь английского языка , третье издание, 2012 г.
  21. ^ Мехри, Бахман (2017). «От Аль-Хорезми к алгоритму». Олимпиады по информатике . 11 (2): 71–74. doi : 10.15388/ioi.2017.special.11 .
  22. ^ "Абу Джафар Мухаммад ибн Муса аль-Хорезми" . Members.peak.org . Архивировано из оригинала 21 августа 2019 года . Проверено 14 ноября 2019 г. .
  23. ^ Клини 1943 в Дэвисе 1965: 274
  24. ^ Россер 1939 в Дэвисе 1965: 225
  25. Стоун 1973:4
  26. ^ Симановски, Роберто (2018). Алгоритм смерти и другие цифровые дилеммы . Несвоевременные размышления. 14 . Перевод Чейза, Джефферсона. Кембридж, Массачусетс: MIT Press. п. 147. ИСБН 9780262536370. Архивировано из оригинала 22 декабря 2019 года . Проверено 27 мая 2019 г. . [...] следующий уровень абстракции центральной бюрократии: глобально действующие алгоритмы.
  27. ^ Дитрих, Эрик (1999). "Алгоритм". В Уилсон, Роберт Эндрю; Кейл, Фрэнк С. (ред.). Энциклопедия когнитивных наук Массачусетского технологического института . Библиотека Cognet Массачусетского технологического института. Кембридж, Массачусетс: MIT Press (опубликовано в 2001 г.). п. 11. ISBN 9780262731447. Проверено 22 июля 2020 г. . Алгоритм — это рецепт, метод или техника выполнения чего-либо.
  28. Стоун просто требует, чтобы «он заканчивался за конечное число шагов» (Stone 1973: 7–8).
  29. Булос и Джеффри 1974, 1999:19
  30. ^ ср Стоун 1972: 5
  31. ^ Кнут 1973: 7 утверждает: «На практике нам нужны не только алгоритмы, нам нужны хорошие алгоритмы ... одним критерием качества является время, необходимое для выполнения алгоритма ... другими критериями является адаптируемость алгоритма к компьютерам. , его простота, изящество и т. д.».
  32. ^ см Стоун 1973: 6
  33. Stone 1973: 7–8 утверждает, что должна существовать «... процедура, которой робот [то есть компьютер] может следовать, чтобы точно определить, как подчиняться инструкции». Стоун добавляет к этому определению конечность процесса и определенность (отсутствие двусмысленности в инструкциях).
  34. ^ Кнут, мест. связывать
  35. ^ Минский 1967 , с. 105
  36. Гуревич 2000:1, 3
  37. ^ Сипсер 2006: 157
  38. ^ Гудрич, Майкл Т .; Тамассия, Роберто (2002), Разработка алгоритмов: основы, анализ и примеры из Интернета , John Wiley & Sons, Inc., ISBN 978-0-471-38365-9, заархивировано из оригинала 28 апреля 2015 г. , получено 14 июня 2018 г.
  39. ^ Кнут 1973: 7
  40. ^ Чайтин 2005:32
  41. ^ Роджерс 1987: 1–2
  42. В своем эссе «Расчеты человека и машины: концептуальный анализ» Сейг 2002:390 приписывает это отличие Робину Ганди, см. Уилфред Сейг и др., 2002 г. Размышления об основах математики: Очерки в честь Соломона Фефермана , Ассоциация Symbolic Logic, AK Peters Ltd, Натик, Массачусетс.
  43. ^ cf Gandy 1980: 126, Тезис Робина Ганди Чёрча и принципы механизмов , опубликованные на стр. 123–148 в J. Barwise et al. 1980 Симпозиум Клини , издательство North-Holland Publishing Company.
  44. ^ «Робот»: «Компьютер — это робот, который выполняет любую задачу, которую можно описать как последовательность инструкций». ср Стоун 1972:3
  45. ↑ « Счёты » Ламбека — это «исчисляемое бесконечное число мест (отверстий, проводов и т. д.) вместе с неограниченным запасом счётчиков (камешки, бусины и т. д.). Местоположения различимы, а счётчики — нет». Отверстия имеют неограниченную вместимость, а рядом стоит агент, который понимает и способен выполнить список инструкций» (Lambek 1961: 295). Ламбек ссылается на Мелзака, который определяет свою Q-машину как «неопределенно большое количество мест. ... неопределенно большое количество счетчиков, распределенных по этим местам, программа и оператор, единственной целью которого является выполнение программы» (Melzak 1961: 283). BBJ (loc. cit.) добавляет условие, что отверстия «способный удерживать любое количество камней» (стр. 46).И Мелзак, и Ламбек появляются в The Canadian Mathematical Bulletin ., том. 4, нет. 3 сентября 1961 г.
  46. ^ Если не возникает путаницы, слово «счетчики» можно опустить, и можно сказать, что местоположение содержит одно «число».
  47. ^ «Мы говорим, что инструкция эффективна , если есть процедура, которой робот может следовать, чтобы точно определить, как выполнять инструкцию». (Стоун 1972: 6)
  48. ^ cf Minsky 1967: Глава 11 «Компьютерные модели» и Глава 14 «Очень простые основы вычислимости», стр. 255–281, в частности,
  49. ^ см Кнут 1973:3.
  50. ^ Но всегда предшествует IF-THEN, чтобы избежать неправильного вычитания.
  51. ^ Кнут 1973: 4
  52. ^ Стоун 1972: 5. Методы извлечения корней нетривиальны: см. Методы вычисления квадратных корней .
  53. ^ Левен, Ян (1990). Справочник по теоретической информатике: алгоритмы и сложность. Том А. Эльзевир. п. 85. ISBN 978-0-444-88071-0.
  54. Джон Г. Кемени и Томас Э. Курц , 1985 г. Назад к основам: история, коррупция и будущее языка , Addison-Wesley Publishing Company, Inc. Рединг, Массачусетс, ISBN 0-201-13433-0 . 
  55. ^ Таусворт 1977: 101
  56. ^ Таусворт 1977: 142
  57. ^ Кнут, 1973 г., раздел 1.2.1, расширенный Таусвортом, 1977 г., на страницах 100 и далее и в главе 9.1.
  58. ^ ср Таусворт 1977
  59. ^ Хит 1908:300; Издание Хокинга в Дувре 2005 г. происходит от Хита.
  60. ^ "'Пусть CD, измеряя BF, оставляет FA меньше, чем он сам." Это изящная аббревиатура для выражения «измерять вдоль ВА последовательные длины, равные CD, до тех пор, пока не будет достигнута точка F, в которой оставшаяся длина FA будет меньше, чем CD; другими словами, пусть BF будет наибольшим точным кратным CD, содержащимся в BA». (Хит 1908:297)
  61. Современные методы лечения с использованием деления в алгоритме см. в Hardy and Wright 1979:180, Knuth 1973:2 (том 1), а также дополнительное обсуждение алгоритма Евклида в Knuth 1969:293–297 (том 2).
  62. Евклид освещает этот вопрос в своем Предложении 1.
  63. ^ «Элементы Евклида, Книга VII, Предложение 2» . Алеф0.кларку.эду. Архивировано из оригинала 24 мая 2012 года . Проверено 20 мая 2012 г.
  64. ^ Хотя это понятие широко используется, его нельзя точно определить.
  65. ^ Кнут 1973: 13–18. Он приписывает «формулировку доказательства алгоритма в терминах утверждений и индукции» Р. В. Флойду, Питеру Науру, К. А. Хоару, Х. Х. Голдстайну и Дж. фон Нейману. Tausworth 1977 заимствует пример Кнута с Евклидом и расширяет метод Кнута в разделе 9.1 Формальные доказательства (стр. 288–298).
  66. ^ Таусворт 1997: 294
  67. ^ см. Кнут 1973: 7 (Том I) и его более подробный анализ на стр. 1969: 294–313 (Том II).
  68. ^ Разрушение происходит, когда алгоритм пытается сжать себя. Успех решит проблему остановки .
  69. ^ Кригель, Ханс-Питер ; Шуберт, Эрих; Зимек, Артур (2016). «(Черное) искусство оценки во время выполнения: мы сравниваем алгоритмы или реализации?». Знания и информационные системы . 52 (2): 341–378. doi : 10.1007/s10115-016-1004-2 . ISSN 0219-1377 . S2CID 40772241 .  
  70. Джиллиан Конахан (январь 2013 г.). «Лучшая математика делает сети передачи данных более быстрыми» . Discovermagazine.com. Архивировано из оригинала 13 мая 2014 года . Проверено 13 мая 2014 г.
  71. ↑ Хайтам Хассание, Петр Индик , Дина Катаби и Эрик Прайс, « Симпозиум ACM-SIAM по дискретным алгоритмам (SODA) ». Архивировано 4 июля 2013 г. в Wayback Machine , Киото, январь 2012 г. См. Также веб-страницу sFFT . Архивировано 21 февраля. , 2012, в Wayback Machine .
  72. Ковальски, 1979 г.
  73. ^ Келлерер, Ганс; Пферши, Ульрих; Писингер, Дэвид (2004). Проблемы с рюкзаком | Ханс Келлерер | Спрингер . Спрингер. doi : 10.1007/978-3-540-24777-7 . ISBN 978-3-540-40286-2. Архивировано из оригинала 18 октября 2017 года . Проверено 19 сентября 2017 г.
  74. ^ Кэрролл, Сью; Дотри, Таз (4 июля 2007 г.). Основные понятия для инженера по качеству программного обеспечения . Американское общество качества. стр. 282 и след. ISBN 978-0-87389-720-4.
  75. ^ Например, объем выпуклого многогранника (описанного с помощью оракула принадлежности) может быть аппроксимирован с высокой точностью алгоритмом рандомизированного полиномиального времени, но не детерминированным: см. Дайер, Мартин; Фриз, Алан; Каннан, Рави (январь 1991 г.), «Алгоритм случайного полиномиального времени для аппроксимации объема выпуклых тел», J. ACM , 38 (1): 1–17, CiteSeerX 10.1.1.145.4600 , doi : 10.1145/102782.102783 , S2CID 13268711  .
  76. ^ Джордж Б. Данциг и Мукунд Н. Тапа. 2003. Линейное программирование 2: теория и расширения . Спрингер-Верлаг.
  77. ^ Цыпкин (1971). Адаптация и обучение в автоматических системах . Академическая пресса. п. 54. ИСБН 978-0-08-095582-7.
  78. ^ Кнут, Дональд Э. (1972). «Древние вавилонские алгоритмы» (PDF) . коммун. АКМ . 15 (7): 671–677. дои : 10.1145/361454.361514 . ISSN 0001-0782 . S2CID 7829945 . Архивировано из оригинала (PDF) 24 декабря 2012 г.   
  79. ↑ Аабо , Асгер (2001), Эпизоды из ранней истории астрономии , Нью-Йорк: Springer, стр. 40–62, ISBN . 978-0-387-95136-2
  80. ^ Аст, Кортни. «Эратосфен» . Государственный университет Уичито: факультет математики и статистики. Архивировано из оригинала 27 февраля 2015 года . Проверено 27 февраля 2015 г.
  81. ^ Шабер, Жан-Люк (2012). История алгоритмов: от гальки до микрочипа . Springer Science & Business Media. п. 2. ISBN 9783642181924.
  82. ^ Дэвис 2000:18
  83. ^ Болтер 1984:24
  84. ^ Болтер 1984:26
  85. ^ Болтер 1984: 33–34, 204–206.
  86. Все цитаты из книги У. Стэнли Джевонса « Элементарные уроки логики: дедуктивная и индуктивная 1880» , Macmillan and Co., Лондон и Нью-Йорк. Переиздано в виде книги Google; ср Джевонс 1880:199-201. Луи Кутюра, 1914 г. Алгебра логики , издательство Open Court Publishing Company, Чикаго и Лондон. Переиздано в виде книги Google; см. Couturat 1914: 75–76 дает еще несколько деталей; он сравнивает это с пишущей машинкой, а также с фортепиано. Джевонс заявляет, что отчет можно найти на 20 января 1870 года в Трудах Королевского общества .
  87. ^ Джевонс 1880: 199–200
  88. Все цитаты из John Venn 1881 Symbolic Logic , Macmillan and Co., Лондон. Переиздано в виде книги Google. см. Венн 1881: 120–125. Заинтересованный читатель может найти более глубокое объяснение на этих страницах.
  89. ^ Диаграмма Белла и Ньюэлла 1971:39, ср. Дэвис 2000
  90. ^ * Мелина Хилл, корреспондент Valley News, Tinkerer получает место в истории , Valley News Западный Ливан, Нью-Хэмпшир, четверг, 31 марта 1983 г., с. 13.
  91. ^ Дэвис 2000:14
  92. ^ ван Хейеноорт 1967: 81ff
  93. ↑ Комментарий ван Хейеноорта к Begriffsschrift Фреге, языку формул, созданному по образцу арифметического, для чистой мысли в van Heijenoort 1967: 1
  94. ^ Диксон 1906, ср. Клини 1952: 36–40
  95. ^ см. сноска в Alonzo Church 1936a в Davis 1965:90 и 1936b в Davis 1965:110
  96. ↑ Клини 1935–6 в Дэвисе 1965: 237ff, Клини 1943 в Дэвисе 1965: 255ff
  97. Церковь 1936 г. в Дэвисе, 1965: 88 и далее.
  98. ^ см. «Конечные комбинаторные процессы - формулировка 1», Post 1936 in Davis 1965: 289–290.
  99. Тьюринг 1936–37 в Дэвисе 1965: 116 и далее.
  100. ^ Россер 1939 в Дэвисе 1965: 226
  101. ^ Клини 1943 в Дэвисе 1965: 273–274
  102. ^ Клини 1952:300, 317
  103. ^ Клини 1952: 376
  104. Тьюринг 1936–37 в Дэвисе 1965: 289–290.
  105. Тьюринг 1936 г. в Дэвисе 1965 г., Тьюринг 1939 г. в Дэвисе 1965: 160
  106. ^ Ходжес, с. 96
  107. ^ Тьюринг 1936–37: 116
  108. ^ a b Тьюринг 1936–37 в Дэвисе 1965: 136
  109. ^ Тьюринг 1939 в Дэвисе 1965:160

Библиография

  • Акст, П. (1959). «О субрекурсивной иерархии и примитивно-рекурсивных степенях» . Труды Американского математического общества . 92 (1): 85–105. дои : 10.2307/1993169 . JSTOR  1993169 .
  • Белл, К. Гордон и Ньюэлл, Аллен (1971), Компьютерные структуры: чтения и примеры , McGraw-Hill Book Company, Нью-Йорк. ISBN 0-07-004357-4 . 
  • Бласс, Андреас ; Гуревич, Юрий (2003). «Алгоритмы: поиски абсолютных определений» (PDF) . Бюллетень Европейской ассоциации теоретической информатики . 81 . Включает прекрасную библиографию из 56 ссылок.
  • Болтер, Дэвид Дж. (1984). Человек Тьюринга: западная культура в компьютерную эпоху (изд. 1984 г.). Чапел-Хилл, Северная Каролина: Издательство Университета Северной Каролины. ISBN 978-0-8078-1564-9., ISBN 0-8078-4108-0 
  • Булос, Джордж ; Джеффри, Ричард (1999) [1974]. Вычислимость и логика (4-е изд.). Издательство Кембриджского университета, Лондон. ISBN 978-0-521-20402-6.: ср. Глава 3 Машины Тьюринга, где обсуждаются «некоторые перечислимые множества, которые не могут быть эффективно (механически) перечислимы».
  • Бургин, Марк (2004). Суперрекурсивные алгоритмы . Спрингер. ISBN 978-0-387-95569-8.
  • Кампаньоло, М.Л., Мур, К. , и Коста, Дж.Ф. (2000) Аналоговая характеристика субрекурсивных функций. В проц. 4-й конференции по реальным числам и компьютерам , Университет Оденсе, стр. 91–109.
  • Черч, Алонзо (1936а). «Неразрешимая проблема элементарной теории чисел». Американский журнал математики . 58 (2): 345–363. дои : 10.2307/2371045 . JSTOR  2371045 .Перепечатано в «Неразрешимом », с. 89 и далее. Первое выражение «Тезиса Черча». См., в частности, страницу 100 ( Неразрешимое ), где он определяет понятие «эффективной вычислимости» в терминах «алгоритм», и он использует слово «заканчивается» и т. д.
  • Черч, Алонзо (1936b). «Заметка о проблеме Entscheidungs». Журнал символической логики . 1 (1): 40–41. дои : 10.2307/2269326 . JSTOR  2269326 . Черч, Алонзо (1936). «Исправление к заметке о Entscheidungsproblem». Журнал символической логики . 1 (3): 101–102. дои : 10.2307/2269030 . JSTOR  2269030 .Перепечатано в «Неразрешимом », с. 110 и далее. Черч показывает, что проблема Entscheidungsproblem неразрешима примерно на 3 страницах текста и 3 страницах сносок.
  • Даффа, Али Абдулла аль- (1977). Мусульманский вклад в математику . Лондон: Крум Хелм. ISBN 978-0-85664-464-1.
  • Дэвис, Мартин (1965). Неразрешимое: основные статьи о неразрешимых предложениях, неразрешимых проблемах и вычислимых функциях . Нью-Йорк: Рэйвен Пресс. ISBN 978-0-486-43228-1.Дэвис дает комментарий перед каждой статьей. Включены статьи Гёделя , Алонзо Чёрча , Тьюринга , Россера , Клини и Эмиля Поста ; те, которые цитируются в статье, перечислены здесь по имени автора.
  • Дэвис, Мартин (2000). Двигатели логики: математики и происхождение компьютера . Нью-Йорк: WW Nortion. ISBN 978-0-393-32229-3.Дэвис предлагает краткие биографии Лейбница , Буля , Фреге , Кантора , Гильберта , Гёделя и Тьюринга с фон Нейманом в роли главного злодея. Очень краткие биографии Джозефа-Мари Жаккара , Бэббиджа , Ады Лавлейс , Клода Шеннона , Говарда Эйкена и др.
  • Всеобщее достояние В эту статью включены общедоступные материалы  из  документа NIST :  Black, Paul E. "algorithm" . Словарь алгоритмов и структур данных .
  • Дин, Тим (2012). «Эволюция и моральное разнообразие» . Балтийский международный ежегодник познания, логики и коммуникации . 7 . дои : 10.4148/biyclc.v7i0.1775 .
  • Деннет, Дэниел (1995). Опасная идея Дарвина . Сложность . 2 . Нью-Йорк: Пробный камень / Саймон и Шустер. стр.  32–36 . Бибкод : 1996Cmplx...2a..32M . doi : 10.1002/(SICI)1099-0526(199609/10)2:1<32::AID-CPLX8>3.0.CO;2-H . ISBN 978-0-684-80290-9.
  • Дилсон, Джесси (2007). Счеты ((1968, 1994) изд.). Издательство Св. Мартина, Нью-Йорк. ISBN 978-0-312-10409-2., ISBN 0-312-10409-X 
  • Юрий Гуревич , Последовательные абстрактные конечные автоматы захватывают последовательные алгоритмы , Транзакции ACM по вычислительной логике, Том 1, № 1 (июль 2000 г.), стр. 77–111. Включает библиографию из 33 источников.
  • ван Хейеноорт, Жан (2001). От Фреге до Гёделя, Справочник по математической логике, 1879–1931 (изд. (1967)). Издательство Гарвардского университета, Кембридж. ISBN 978-0-674-32449-7., 3-е издание, 1976 г. [?], ISBN 0-674-32449-8 (пбк.) 
  • Ходжес, Эндрю (1983). Алан Тьюринг: Загадка . Физика сегодня . 37 . Нью-Йорк: Саймон и Шустер . стр. 107–108. Бибкод : 1984PhT....37k.107H . дои : 10.1063/1.2915935 . ISBN 978-0-671-49207-6., ISBN 0-671-49207-1 . См. Глава «Дух истины» для истории, ведущей к его доказательству, и обсуждения его. 
  • Клини, Стивен С. (1936). «Общие рекурсивные функции натуральных чисел» . Математический Аннален . 112 (5): 727–742. DOI : 10.1007/ BF01565439 . S2CID 120517999 . Архивировано из оригинала 3 сентября 2014 года . Проверено 30 сентября 2013 г. Представлено Американскому математическому обществу в сентябре 1935 г. Перепечатано в The Undecidable , p. 237 и далее. Определение «общей рекурсии», данное Клини (теперь известное как мю-рекурсия), было использовано Черчем в его статье 1935 года «Неразрешимая проблема элементарной теории чисел» , которая доказала, что «проблема принятия решения» является «неразрешимой» (т. Е. Отрицательным результатом).
  • Клини, Стивен С. (1943). «Рекурсивные предикаты и кванторы» . Труды Американского математического общества . 53 (1): 41–73. дои : 10.2307/1990131 . JSTOR  1990131 .Перепечатано в «Неразрешимом », с. 255 и далее. Клини уточнил свое определение «общей рекурсии» и в своей главе «12. Алгоритмические теории» сформулировал «Тезис I» (стр. 274); позже он повторит этот тезис (в Kleene 1952:300) и назовет его «Тезисом Церкви» (Kleene 1952:317) (т.е. тезисом Черча ).
  • Клини, Стивен С. (1991) [1952]. Введение в метаматематику (десятое изд.). Издательство Северной Голландии. ISBN 978-0-7204-2103-3.
  • Кнут, Дональд (1997). Основные алгоритмы, третье издание . Рединг, Массачусетс: Аддисон-Уэсли. ISBN 978-0-201-89683-1.
  • Кнут, Дональд (1969). Том 2/Получисленные алгоритмы, Искусство компьютерного программирования, первое издание . Рединг, Массачусетс: Аддисон-Уэсли.
  • Косовский Н.К. Элементы математической логики и ее приложение к теории субрекурсивных алгоритмов , ЛГУ, Л., 1981.
  • Ковальски, Роберт (1979). «Алгоритм=Логика+Управление». Коммуникации АКМ . 22 (7): 424–436. дои : 10.1145/359131.359136 . S2CID  2509896 .
  • А.А. Марков (1954) Теория алгоритмов . [Переведено Жаком Дж. Шорр-Коном и сотрудниками PST] Выходные данные Москва, Академия наук СССР, 1954 [т.е., Иерусалим, Израильская программа научных переводов, 1961; можно получить в Управлении технических служб Министерства торговли США, Вашингтон] Описание 444 стр. 28 см. Добавлен т.п. Русский перевод трудов Математического института АН СССР, т. 42. Оригинальное название: Теория алгерифмов. [QA248.M2943 Библиотека Дартмутского колледжа. Министерство торговли США, Управление технических служб, номер OTS 60-51085.]
  • Минский, Марвин (1967). Вычисление: конечные и бесконечные машины (первое изд.). Прентис-Холл, Энглвуд Клиффс, Нью-Джерси. ISBN 978-0-13-165449-5.Минский расширяет свою «... идею алгоритма - эффективной процедуры ...» в главе 5.1 « Вычислимость, эффективные процедуры и алгоритмы». Бесконечные машины.
  • Пост, Эмиль (1936). «Конечные комбинаторные процессы, формулировка I». Журнал символической логики . 1 (3): 103–105. дои : 10.2307/2269031 . JSTOR  2269031 .Перепечатано в The Undecidable , стр. 289ff. Пост определяет простой алгоритмический процесс, когда человек пишет пометки или стирает пометки, переходит от коробки к коробке и, в конце концов, останавливается, следуя списку простых инструкций. Это цитируется Клини как один из источников его «Тезиса I», так называемого тезиса Черча-Тьюринга .
  • Роджерс-младший, Хартли (1987). Теория рекурсивных функций и эффективная вычислимость . Пресс Массачусетского технологического института. ISBN 978-0-262-68052-3.
  • Россер, Дж. Б. (1939). «Неформальное изложение доказательств теоремы Геделя и теоремы Черча». Журнал символической логики . 4 (2): 53–60. дои : 10.2307/2269059 . JSTOR  2269059 .Перепечатано в «Неразрешимом », с. 223 и далее. Здесь приводится знаменитое определение «эффективного метода», данное Россером: «…метод, каждый шаг которого точно предопределен и который обязательно даст ответ за конечное число шагов… машина, которая затем решит любую проблему набор без вмешательства человека, кроме вставки вопроса и (позже) чтения ответа »(стр. 225–226, Неразрешимое )
  • Сантос-Ланг, Кристофер (2014). «Подходы моральной экологии к машинной этике» (PDF) . В ван Рисевик, Саймон; Понтье, Маттейс (ред.). Машинная медицинская этика . Интеллектуальные системы, управление и автоматизация: наука и техника. 74 . Швейцария: Спрингер. стр. 111–127. doi : 10.1007/978-3-319-08108-3_8 . ISBN 978-3-319-08107-6.
  • Скотт, Майкл Л. (2009). Прагматика языка программирования (3-е изд.). Издательство Морган Кауфманн/Эльзевир. ISBN 978-0-12-374514-9.
  • Сипсер, Майкл (2006). Введение в теорию вычислений . Издательство PWS. ISBN 978-0-534-94728-6.
  • Трезвый, Эллиотт; Уилсон, Дэвид Слоан (1998). Для других: эволюция и психология бескорыстного поведения . Кембридж: Издательство Гарвардского университета. ISBN 9780674930469.
  • Стоун, Гарольд С. (1972). Введение в компьютерную организацию и структуры данных (изд. 1972 г.). Макгроу-Хилл, Нью-Йорк. ISBN 978-0-07-061726-1.См. в частности, первая глава под названием « Алгоритмы, машины Тьюринга и программы» . Его лаконичное неформальное определение: «...любая последовательность инструкций, которой может подчиняться робот, называется алгоритмом » (с. 4).
  • Таусворт, Роберт С. (1977). Стандартизированная разработка компьютерного программного обеспечения. Часть 1. Методы . Энглвуд Клиффс, штат Нью-Джерси: ISBN Prentice – Hall, Inc. 978-0-13-842195-3.
  • Тьюринг, Алан М. (1936–37). «О вычислимых числах с приложением к проблеме Entscheidungs». Труды Лондонского математического общества . Серия 2. 42 : 230–265. doi : 10.1112/plms/s2-42.1.230 .. Исправления, там же, том. 43 (1937), стр. 544–546. Перепечатано в «Неразрешимом », с. 116 и далее. Знаменитая работа Тьюринга была завершена как магистерская диссертация в Королевском колледже Кембриджа, Великобритания.
  • Тьюринг, Алан М. (1939). «Системы логики на основе ординалов». Труды Лондонского математического общества . 45 : 161–228. doi : 10.1112/plms/s2-45.1.161 . hdl : 21.11116/0000-0001-91CE-3 .Перепечатано в «Неразрешимом », стр. 155 и далее. Статья Тьюринга, в которой дается определение «оракула», была его докторской диссертацией в Принстоне.
  • Ведомство США по патентам и товарным знакам (2006 г.), 2106.02 **> Математические алгоритмы: патентоспособность 2100 г., Руководство по процедуре патентной экспертизы (MPEP). Последняя редакция, август 2006 г.

дальнейшее чтение

  • Белла, Роберт Нилли (1985). Привычки сердца: индивидуализм и приверженность американской жизни . Беркли: Калифорнийский университет Press. ISBN 978-0-520-25419-0.
  • Берлински, Дэвид (2001). Пришествие алгоритма: 300-летнее путешествие от идеи к компьютеру . Книги урожая. ISBN 978-0-15-601391-8.
  • Шабер, Жан-Люк (1999). История алгоритмов: от гальки до микрочипа . Спрингер Верлаг. ISBN 978-3-540-63369-3.
  • Томас Х. Кормен; Чарльз Э. Лейзерсон; Рональд Л. Ривест; Клиффорд Стейн (2009). Введение в алгоритмы (3-е изд.). Массачусетский технологический институт Пресс. ISBN 978-0-262-03384-8.
  • Харел, Дэвид; Фельдман, Ишай (2004). Алгоритмика: дух вычислений . Эддисон-Уэсли. ISBN 978-0-321-11784-7.
  • Герцке, Аллен Д.; МакРори, Крис (1998). «Концепция моральной экологии». В Лоулер, Питер Августин; МакКонки, Дейл (ред.). Сообщество и политическая мысль сегодня . Вестпорт, Коннектикут: Прегер .
  • Кнут, Дональд Э. (2000). Избранные статьи по анализу алгоритмов . Стэнфорд, Калифорния: Центр изучения языка и информации.
  • Кнут, Дональд Э. (2010). Избранные статьи по разработке алгоритмов . Стэнфорд, Калифорния: Центр изучения языка и информации.
  • Уоллах, Венделл; Аллен, Колин (ноябрь 2008 г.). Моральные машины: обучение роботов правильному из неправильного . США: Издательство Оксфордского университета. ISBN 978-0-19-537404-9.
  • Бликли, Крис (2020). Стихи, решающие головоломки: история и наука об алгоритмах . Издательство Оксфордского университета. ISBN 978-0-19-885373-2.

внешняя ссылка

  • «Алгоритм» , Математическая энциклопедия , EMS Press , 2001 [1994]
  • Алгоритмы в Керли
  • Вайсштейн, Эрик В. «Алгоритм» . Мир Математики .
  • Словарь алгоритмов и структур данных - Национальный институт стандартов и технологий
Репозитории алгоритмов
  • Репозиторий алгоритмов Стоуни-Брук - Государственный университет Нью-Йорка в Стоуни-Брук
  • Сборник алгоритмов ACM — Association for Computing Machinery
  • Stanford GraphBase – Стэнфордский университет
Получено с " https://en.wikipedia.org/w/index.php?title=Algorithm&oldid=1062001942 "