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

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

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

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

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

Само слово « алгоритм » происходит от имени математика 9-го века Мухаммада ибн Муса аль-Хваризми , чья нисба (идентифицирующая его как из Хорезма ) была латинизирована как Алгоритми . [14] Частичная формализация того, что станет современной концепцией алгоритма, началась с попыток решить Entscheidungsproblem (проблему решения), поставленную Дэвидом Гильбертом в 1928 году. Более поздние формализации были сформулированы как попытки определить « эффективную вычислимость » [15] или « эффективный метод ». [16] Эти формализации включали Гёделевский -Herbrand - Клини рекурсивные функции от 1930, 1934 и 1935, Алонзо Черч «s лямбда - исчисления 1936 года, Эмиль Post » s Рецептура 1 из 1936, и Алан Тьюринг «s машины Тьюринга из 1936-37 и 1939.

Этимология [ править ]

Слово «алгоритм» имеет свои корни в латинизации нисбы, указывающей на его географическое происхождение, от имени персидского математика Мухаммада ибн Мусы аль-Хорезми до алгоритма . [17] [18] Аль-Хваризми ( арабизированный персидский الخوارزمی c. 780–850) был математиком, астрономом , географом и ученым из Дома Мудрости в Багдаде , [11] имя которого означает «уроженец Хорезма », регион, который был частью Великого Ирана, а сейчас находится в Узбекистане . [19] [20]

Около 825 года аль-Хорезми написал трактат на арабском языке об индуистско-арабской системе счисления , который был переведен на латынь в XII веке. Рукопись начинается с фразы « Диксит Алгоризми» («Так говорил Аль-Хорезми»), где «Алгоризми» было латинизированным переводчиком имени Аль-Хорезми. [21] Аль-Хорезми был самым читаемым математиком в Европе в период позднего средневековья, в первую очередь благодаря другой его книге, « Алгебре» . [22] В позднесредневековой латыни algorismus , английское слово « алгоритмизм », искажение его имени, просто означало "десятичная система счисления ".[23] В 15 веке, под влиянием греческого слова ἀριθμός ( арифмос ), «число» ( ср. «Арифметика»), латинское слово было изменено на algorithmus , и соответствующий английский термин «алгоритм» впервые засвидетельствован. в 17 веке; современный смысл был введен в 19 веке. [24]

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

Другое раннее использование этого слова относится к 1240 году в руководстве под названием Carmen de Algorismo, составленном Александром де Вильдье . Он начинается с:

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

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

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

Стихотворение нескольких сот строк в длиной и суммирует искусство вычисления с новыми стилизованными индийскими костьми ( Тали Indorum ) или индуистскими цифрами. [26]

Неофициальное определение [ править ]

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

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

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

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

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

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

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

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

Формализация [ править ]

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

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

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

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

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

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

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

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

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

Выражение алгоритмов [ править ]

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

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

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

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

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

Дизайн [ править ]

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

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

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

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

Реализация [ править ]

Алгоритм логической NAND , реализованный в электронном виде в чипе 7400

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры [ править ]

Пример алгоритма [ править ]

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

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

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

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

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

Алгоритм Евклида [ править ]

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

Euclid «s алгоритм для вычисления наибольший общий делитель (НОД) двух чисел появляется как предложение II в книге VII („Элементарная теория чисел“) его элементов . [61] Евклид ставит задачу следующим образом: «Если даны два числа, не простые по отношению друг к другу, найти их наибольшую общую меру». Он определяет «число [быть] множеством, состоящим из единиц»: счетное число, положительное целое число, не включая ноль. «Измерение» означает размещение более короткой измерительной длины s последовательно ( q раз) вдоль большей длины l до тех пор, пока оставшаяся часть r не станет меньше меньшей длины s . [62] Говоря современным языком,остатокr = l - q × s , где q - частное, или остаток r - это «модуль», целочисленная дробная часть, оставшаяся после деления. [63]

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

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

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

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

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

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

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

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

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

ВХОД :

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

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

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

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

7 ЕСЛИ S> R ТО сделал измерения так GOTO 10 ЕЩЕ измерить еще раз,8 R ← R - S9 [Остаточный цикл]: GOTO 7 .

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

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

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

11 L ← R12 R ← S13 S ← L14 [Повторите процесс измерения]: GOTO 7

ВЫХОД :

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

СДЕЛАНО :

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

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

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

 5  REM алгоритм Евклида для наибольшего общего делителя  6  PRINT  «Введите два целых числа больше 0»  10  INPUT  A , B  20  IF  B = 0  THEN  GOTO  80  30  IF  A  >  B  THEN  GOTO  60  40  LET  B = B - A  50  GOTO  20  60  Пусть  A = A - B  70  GOTO  20  80  PRINT  A  90  END

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

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

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

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

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

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

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

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

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

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

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

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

Алгоритмический анализ [ править ]

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

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

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

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

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

Эффективность исполнения [ править ]

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

Классификация [ править ]

Есть разные способы классификации алгоритмов, каждый со своими достоинствами.

По реализации [ править ]

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

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

По парадигме дизайна [ править ]

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

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

Проблемы оптимизации [ править ]

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

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

По специальности [ править ]

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

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

По сложности [ править ]

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

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

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

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

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

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

Правовые вопросы [ править ]

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

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

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

Древний Ближний Восток [ править ]

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

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

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

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

Использование символов в качестве "заполнителей" для чисел: алгебра [ править ]

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

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

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

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

Механические приспособления с дискретными состояниями [ править ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Его пространство символов было бы

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

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

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

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

Редукция Тьюринга дает следующее:

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

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

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

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

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

Дж. Б. Россер (1939) и С. К. Клини (1943) [ править ]

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

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

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

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

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

История после 1950 г. [ править ]

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

См. Также [ править ]

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

Заметки [ править ]

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

Библиография [ править ]

  • Акст, П. (1959). «О субрекурсивной иерархии и примитивных рекурсивных степенях» . Труды Американского математического общества . 92 (1): 85–105. DOI : 10.2307 / 1993169 . JSTOR  1993 169 .
  • Белл, К. Гордон и Ньюэлл, Аллен (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). Суперрекурсивные алгоритмы . Springer. ISBN 978-0-387-95569-8.
  • Campagnolo, ML, Moore, C. , and Costa, JF (2000) Аналоговая характеристика субрекурсивных функций. В Proc. Четвертой конференции по действительным числам и компьютерам , Университет Оденсе, стр. 91–109
  • Церковь, Алонсо (1936a). «Неразрешимая проблема элементарной теории чисел». Американский журнал математики . 58 (2): 345–363. DOI : 10.2307 / 2371045 . JSTOR  2371045 .Перепечатано в The Undecidable , p. 89ff. Первое выражение «тезиса Чёрча». См., В частности, страницу 100 ( «Неразрешимое» ), где он определяет понятие «эффективная вычислимость» в терминах «алгоритма», он использует слово «завершается» и т. Д.
  • Церковь, Алонсо (1936b). «Заметка о проблеме Entscheidungsproblem». Журнал символической логики . 1 (1): 40–41. DOI : 10.2307 / 2269326 . JSTOR  2269326 . Церковь, Алонсо (1936). «Исправление к примечанию по проблеме Entscheidungsproblem». Журнал символической логики . 1 (3): 101–102. DOI : 10.2307 / 2269030 . JSTOR  2269030 .Перепечатано в The Undecidable , p. 110ff. Черч показывает, что проблема Entscheidungs ​​неразрешима примерно на 3 страницах текста и 3 страницах сносок.
  • Даффа, Али Абдулла аль- (1977). Вклад мусульман в математику . Лондон: Крум Хелм. ISBN 978-0-85664-464-1.
  • Дэвис, Мартин (1965). Неразрешимые: основные статьи о неразрешимых предложениях, неразрешимых проблемах и вычислимых функциях . Нью-Йорк: Raven Press. ISBN 978-0-486-43228-1.Дэвис дает комментарий перед каждой статьей. Включены статьи Геделя , Алонзо Черча , Тьюринга , Россера , Клини и Эмиля Поста ; цитируемые в статье перечислены здесь по фамилии авторов.
  • Дэвис, Мартин (2000). Двигатели логики: математики и происхождение компьютера . Нью-Йорк: WW Nortion. ISBN 978-0-393-32229-3.Дэвис предлагает краткие биографии Лейбница , Буля , Фреге , Кантора , Гильберта , Гёделя и Тьюринга с фон Нейманом как злодеем-злодеем. Очень краткие биографии Жозефа-Мари Жаккарда , Бэббиджа , Ады Лавлейс , Клода Шеннона , Говарда Эйкена и т. Д.
  •  Эта статья включает материалы, являющиеся общественным достоянием  из  документа NIST :  Black, Paul E. "algorithm" . Словарь алгоритмов и структур данных .
  • Дин, Тим (2012). «Эволюция и нравственное разнообразие» . Балтийский международный ежегодник познания, логики и коммуникации . 7 . DOI : 10.4148 / biyclc.v7i0.1775 .
  • Деннет, Дэниел (1995). Опасная идея Дарвина . Сложность . 2 . Нью-Йорк: Пробный камень / Саймон и Шустер. стр.  32 -36. Bibcode : 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). Abacus ((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 (pbk.) 
  • Ходжес, Эндрю (1983). Алан Тьюринг: Загадка . Физика сегодня . 37 . Нью-Йорк: Саймон и Шустер . С. 107–108. Bibcode : 1984PhT .... 37k.107H . DOI : 10.1063 / 1.2915935 . ISBN 978-0-671-49207-6., ISBN 0-671-49207-1 . Ср. Глава «Дух истины» для истории, ведущей к его доказательству, и его обсуждения. 
  • Клини, Стивен К. (1936). "Общие рекурсивные функции натуральных чисел" . Mathematische Annalen . 112 (5): 727-742. DOI : 10.1007 / BF01565439 . S2CID  120517999 . Архивировано из оригинала на 3 сентября 2014 года . Проверено 30 сентября 2013 года .Представлено Американскому математическому обществу, сентябрь 1935 г. Перепечатано в The Undecidable , p. 237ff. Определение Клини «общей рекурсии» (известное теперь как мю-рекурсия) было использовано Черчем в его статье 1935 года «Неразрешимая проблема элементарной теории чисел», в которой доказывалась «неразрешимость» «проблемы решения» (т. Е. Отрицательный результат).
  • Клини, Стивен С. (1943). «Рекурсивные предикаты и квантификаторы» . Труды Американского математического общества . 54 (1): 41–73. DOI : 10.2307 / 1990131 . JSTOR  1990131 .Перепечатано в The Undecidable , p. 255ff. Клини уточнил свое определение «общей рекурсии» и продолжил в своей главе «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). «Алгоритм = Логика + Управление». Коммуникации ACM . 22 (7): 424–436. DOI : 10.1145 / 359131.359136 . S2CID  2509896 .
  • Марков А.А. (1954) Теория алгоритмов . [Перевод Жака Шорр-Кона и сотрудников PST] Выходные данные Москва, Академия наук СССР, 1954 [т.е. Иерусалим, Программа научных переводов Израиля, 1961; можно получить в Управлении технических служб Министерства торговли США, Вашингтон] Описание 444 p. 28 см. Добавлен tp в русском переводе трудов Математического института АН СССР, т. 42. Первоначальное название: Теория алгерифмов. [QA248.M2943 Библиотека Дартмутского колледжа. Министерство торговли США, Управление технических услуг, номер OTS 60-51085.]
  • Минский, Марвин (1967). Вычисление: конечные и бесконечные машины (Первое изд.). Прентис-Холл, Энглвуд-Клиффс, Нью-Джерси. ISBN 978-0-13-165449-5.Мински расширяет свое «... представление об алгоритме - эффективной процедуре ...» в главе 5.1. Вычислимость, эффективные процедуры и алгоритмы. Бесконечные машины.
  • Пост, Эмиль (1936). «Конечные комбинаторные процессы, формулировка I». Журнал символической логики . 1 (3): 103–105. DOI : 10.2307 / 2269031 . JSTOR  2269031 .Перепечатано в The Undecidable , pp. 289ff. Пост определяет простой алгоритм, похожий на процесс написания или стирания пометок человеком, перехода от коробки к коробке и, в конечном итоге, остановки, следуя списку простых инструкций. Клини цитирует это как один из источников своего «Тезиса I», так называемого тезиса Чёрча-Тьюринга .
  • Роджерс-младший, Хартли (1987). Теория рекурсивных функций и эффективной вычислимости . MIT Press. ISBN 978-0-262-68052-3.
  • Россер, JB (1939). "Неформальное изложение доказательств теоремы Гёделя и теоремы Чёрча". Журнал символической логики . 4 (2): 53–60. DOI : 10.2307 / 2269059 . JSTOR  2269059 .Перепечатано в The Undecidable , p. 223ff. Вот знаменитое определение Россером «эффективного метода»: «... метод, каждый шаг которого точно предопределен и который обязательно даст ответ за конечное число шагов ... машина, которая затем решит любую задачу набор без вмешательства человека, кроме вставки вопроса и (позже) чтения ответа »(стр. 225–226, « Неразрешимое » )
  • Сантос-Ланг, Кристофер (2014). «Моральные экологические подходы к машинной этике» (PDF) . У ван Ризевика, Саймона; Понтье, Маттейс (ред.). Машинная медицинская этика . Интеллектуальные системы, управление и автоматизация: наука и техника. 74 . Швейцария: Шпрингер. С. 111–127. DOI : 10.1007 / 978-3-319-08108-3_8 . ISBN 978-3-319-08107-6.
  • Скотт, Майкл Л. (2009). Прагматика языка программирования (3-е изд.). Издательство Morgan Kaufmann / Elsevier. ISBN 978-0-12-374514-9.
  • Сипсер, Майкл (2006). Введение в теорию вычислений . Издательская компания PWS. ISBN 978-0-534-94728-6.
  • Собер, Эллиотт; Уилсон, Дэвид Слоан (1998). Для других: эволюция и психология бескорыстного поведения . Кембридж: Издательство Гарвардского университета.
  • Стоун, Гарольд С. (1972). Введение в компьютерную организацию и структуры данных (изд. 1972 г.). Макгроу-Хилл, Нью-Йорк. ISBN 978-0-07-061726-1.Ср. в частности, первая глава, озаглавленная: « Алгоритмы, машины Тьюринга и программы» . Его краткое неформальное определение: «... любая последовательность инструкций, которую может выполнить робот, называется алгоритмом » (стр. 4).
  • Tausworthe, Роберт C (1977). Стандартизированные методы разработки программного обеспечения. Часть 1 . Энглвуд Клиффс, штат Нью-Джерси: Prentice-Hall, Inc. ISBN 978-0-13-842195-3.
  • Тьюринг, Алан М. (1936–37). "О вычислимых числах, с приложением к Entscheidungsproblem". Труды Лондонского математического общества . Series 2. 42 : 230–265. DOI : 10.1112 / plms / s2-42.1.230 .. Исправления, там же, т. 43 (1937), стр. 544–546. Перепечатано в The Undecidable , p. 116ff. Знаменитая статья Тьюринга была защищена как магистерская диссертация в Королевском колледже Кембриджа, Великобритания.
  • Тьюринг, Алан М. (1939). «Системы логики, основанные на порядковых числах». Труды Лондонского математического общества . 45 : 161–228. DOI : 10.1112 / ПНИЛИ / s2-45.1.161 . ЛВП : 21,11116 / 0000-0001-91CE-3 .Перепечатано в The Undecidable , pp. 155ff. Статья Тьюринга, определяющая «оракул», была его докторской диссертацией в Принстоне.
  • США по патентам и товарным знакам (2006 г.), 2106.02 **> Математические алгоритмы: патентоспособность 2100 , Руководство по процедуре патентной экспертизы (MPEP). Последняя редакция: август 2006 г.

Дальнейшее чтение [ править ]

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

Внешние ссылки [ править ]

  • "Алгоритм" , Энциклопедия математики , EMS Press , 2001 [1994]
  • Алгоритмы в Curlie
  • Вайсштейн, Эрик В. «Алгоритм» . MathWorld .
  • Словарь алгоритмов и структур данных - Национальный институт стандартов и технологий
Репозитории алгоритмов
  • Репозиторий алгоритмов Стоуни-Брук - Государственный университет Нью-Йорка в Стоуни-Брук
  • Сборник алгоритмов ACM - Association for Computing Machinery
  • Stanford GraphBase - Стэнфордский университет