stringtranslate.com

Алгоритм

В цикле вычтите большее число из меньшего. Остановите цикл, когда вычитание сделает число отрицательным. Оцените два числа, равно ли одно из них нулю или нет. Если да, то другое число примите за наибольший общий делитель. Если нет, снова поместите два числа в цикл вычитания.
Блок-схема использования последовательных вычитаний для нахождения наибольшего общего делителя чисел r и s

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

Напротив, эвристика — это подход к решению проблем, который может быть не полностью определен или не может гарантировать правильные или оптимальные результаты, особенно в проблемных областях, где нет четко определенного правильного или оптимального результата. [3] Например, рекомендательные системы социальных сетей полагаются на эвристику таким образом, что, хотя в популярных средствах массовой информации 21-го века их широко называют «алгоритмами», они не могут дать правильные результаты из-за характера проблемы.

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

Этимология

Около 825 года нашей эры персидский ученый и эрудит Мухаммад ибн Муса аль-Хорезми написал «Китаб аль-Хисаб аль-хинди» («Книга индийских вычислений») и « Китаб аль-джам' ва'ль-тафрик аль-Хисаб аль-хинди» («Дополнение»). и вычитание в индийской арифметике»). [1] В начале XII века появились латинские переводы упомянутых текстов аль-Хорезми, включающие индуистско-арабскую систему счисления и арифметику , например, Liber Alghoarismi de practica arismetrice , приписываемую Иоанну Севильскому , и Liber Algorismi de numero Indorum , приписываемую Аделарду Батскому . [2] Таким образом, alghoarismi или algorismi — это латинизация имени Аль-Хорезми; текст начинается с фразы Dixit Algorismi , или «Так говорил Аль-Хорезми». [3] Около 1230 года было засвидетельствовано использование английского слова «алгоризм» , а затем Чосером в 1391 году английский язык принял французский термин. [4] [5] [ нужны разъяснения ] В 15 веке под влиянием греческого слова ἀριθμός ( арифмос , «число»; ср. «арифметика») латинское слово было изменено на алгоритмус . [ нужна цитата ]

Определение

Одним из неофициальных определений является «набор правил, который точно определяет последовательность операций», [11] [ для проверки требуется цитата ] , который включает в себя все компьютерные программы (включая программы, которые не выполняют числовые вычисления) и (например) любые предписанная бюрократическая процедура [12] или рецепт из кулинарной книги . [13] В общем, программа является алгоритмом только в том случае, если она в конце концов останавливается [14] — даже несмотря на то, что бесконечные циклы иногда могут оказаться желательными. Булос, Джеффри и 1974, 1999 определяют алгоритм как набор инструкций для определения результата, заданных явно в форме, которой может следовать либо вычислительная машина, либо человек, который может выполнять только определенные элементарные операции с символами . [15]

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

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

История

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

С древности были засвидетельствованы пошаговые процедуры решения математических задач. Сюда входят вавилонская математика (около 2500 г. до н. э.), [16] египетская математика (около 1550 г. до н. э.), [16] индийская математика (около 800 г. до н. э. и позже), [17] [18] Оракул Ифа (около 500 г. до н. э.), Греческая математика (около 240 г. до н.э.) [19] и арабская математика (около 800 г. н.э.). [20]

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

Алгоритмы арифметики также встречаются в древнеегипетской математике , начиная с Математического папируса Ринда ок.  1550 г. до н.э. [16] Позднее алгоритмы использовались в древней эллинистической математике . Двумя примерами являются «Решето Эратосфена» , которое было описано во «Введении в арифметику» Никомаха , [23] [19] : гл. 9.2  , и алгоритм Евклида , который был впервые описан в «Началах» Евклида ( ок.  300 г. до н. э. ). [19] : Глава 9.1.  Примеры древнеиндийской математики включают « Шулба-сутры» , школу Кералы и «Брахмаспхутасиддханту» . [17]

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

Компьютеры

Весовые часы

Болтер считает изобретение часов с весовым приводом «ключевым изобретением [Европы в Средневековье]». В частности, он отдает должное механизму спускового механизма [24] , который обеспечивает нам тиканье и такт механических часов. «Точная автоматическая машина» [25] сразу привела к «механическим автоматам », начиная с XIII века, и, наконец, к «вычислительным машинам» — разностной машине и аналитическим машинам Чарльза Бэббиджа и графини Ады Лавлейс , середина XIX века. [26] Лавлейсу приписывают первое создание алгоритма, предназначенного для обработки на компьютере — аналитической машины Бэббиджа, первого устройства, считавшегося настоящим Тьюринг-полным компьютером, а не просто калькулятором — и иногда его называют «первым программистом в истории», как В результате, хотя полная реализация второго устройства Бэббиджа будет реализована только спустя десятилетия после ее жизни.

Электромеханическое реле

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

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

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

Диаграмма Ады Лавлейс из « Note G », первого опубликованного компьютерного алгоритма.

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

Представительства

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

Машины Тьюринга

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

Представление блок-схемы

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

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

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

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

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

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

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

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

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

Дизайн

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

Структурированное программирование

Согласно тезису Чёрча-Тьюринга , любой алгоритм может быть вычислен с помощью модели, известной как полная по Тьюрингу . Фактически было продемонстрировано, что для полноты по Тьюрингу требуется только четыре типа инструкций — условный GOTO, безусловный GOTO, присваивание и HALT. Однако Кемени и Курц отмечают, что, хотя «недисциплинированное» использование безусловных GOTO и условных IF-THEN GOTO может привести к « спагетти-коду », программист может писать структурированные программы, используя только эти инструкции; с другой стороны, «также возможно и не слишком сложно писать плохо структурированные программы на структурированном языке». [39] Таусворт дополняет три канонические структуры Бема-Якопини : [40] ПОСЛЕДОВАТЕЛЬНОСТЬ, ЕСЛИ-ТО-ЛИБО и ПОКА-ДЕЛАТЬ, еще двумя: ДЕЛАТЬ-ПОКА и СЛУЧАЙ. [41] Дополнительным преимуществом структурированной программы является то, что ее корректность можно доказать с помощью математической индукции . [42]

Легальное положение

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

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

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

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

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

Алгоритм наибольшего числаВходные данные: список чисел L .Выходные данные: Самое большое число в списке L .
если  L.size = 0 вернуть нулевой наибольшийL [0] для каждого  элемента  в  L , сделать  , если  элемент > самый большой , то  самый большойэлемент вернуть  самый большой

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

Примечания

  1. ^ ab «Определение АЛГОРИТМА». Интернет-словарь Мерриам-Вебстера . Архивировано из оригинала 14 февраля 2020 года . Проверено 14 ноября 2019 г.
  2. ^ аб Блэр, Энн, Дугид, Пол, Гоинг, Аня-Сильвия и Графтон, Энтони. Информация: Исторический спутник, Принстон: Princeton University Press, 2021. с. 247
  3. ^ ab Дэвид А. Гроссман, Офир Фридер, Информационный поиск: алгоритмы и эвристика , 2-е издание, 2004 г., ISBN 1402030045 
  4. ^ ab «Например, любой классический математический алгоритм можно описать конечным числом английских слов» (Роджерс 1987:2).
  5. ^ ab Четко определено в отношении агента, выполняющего алгоритм: «Существует вычислительный агент, обычно человек, который может реагировать на инструкции и выполнять вычисления» (Rogers 1987:2).
  6. ^ «Алгоритм - это процедура вычисления функции (относительно некоторых выбранных обозначений целых чисел) ... это ограничение (числовых функций) не приводит к потере общности» (Rogers 1987: 1).
  7. ^ «Алгоритм имеет ноль или более входных данных, то есть величин , которые ему задаются изначально до начала работы алгоритма» (Кнут 1973:5).
  8. ^ «Процедура, которая обладает всеми характеристиками алгоритма, за исключением того, что ей, возможно, не хватает конечности, может быть названа« вычислительным методом » » (Кнут 1973:5).
  9. ^ «Алгоритм имеет один или несколько выходных данных, то есть величины, которые имеют определенное отношение к входным данным» (Кнут 1973:5).
  10. ^ Является ли процесс со случайными внутренними процессами (не включая входные) алгоритмом, является дискуссионным. Роджерс полагает, что: «вычисления выполняются дискретно, поэтапно, без использования непрерывных методов или аналоговых устройств... проводятся детерминированно, без обращения к случайным методам или устройствам, например игральным костям» (Rogers 1987:2) .
  11. ^ Стоун 1973: 4
  12. ^ Симановский, Роберто (2018). Алгоритм смерти и другие цифровые дилеммы. Несвоевременные размышления. Том. 14. Перевод Чейза, Джефферсона. Кембридж, Массачусетс: MIT Press. п. 147. ИСБН 9780262536370. Архивировано из оригинала 22 декабря 2019 года . Проверено 27 мая 2019 г. [...] следующий уровень абстракции центральной бюрократии: глобально действующие алгоритмы.
  13. ^ Дитрих, Эрик (1999). "Алгоритм". В Уилсоне, Роберт Эндрю; Кейл, Фрэнк С. (ред.). Энциклопедия когнитивных наук Массачусетского технологического института. Библиотека MIT Cognet. Кембридж, Массачусетс: MIT Press (опубликовано в 2001 г.). п. 11. ISBN 9780262731447. Проверено 22 июля 2020 г. Алгоритм — это рецепт, метод или техника выполнения чего-либо.
  14. ^ Стоун требует, чтобы «он заканчивался за конечное число шагов» (Stone 1973:7–8).
  15. ^ Булос и Джеффри 1974,1999:19
  16. ^ abcd Шабер, Жан-Люк (2012). История алгоритмов: от камешка до микрочипа . Springer Science & Business Media. стр. 7–8. ISBN 9783642181924.
  17. ^ аб Шрирам, MS (2005). «Алгоритмы в индийской математике». В Эмче, Джерард Г.; Шридхаран, Р.; Шринивас, доктор медицины (ред.). Вклад в историю индийской математики . Спрингер. п. 153. ИСБН 978-93-86279-25-5.
  18. ^ Хаяши, Т. (1 января 2023 г.). Брахмагупта. Британская энциклопедия.
  19. ^ abc Cooke, Роджер Л. (2005). История математики: Краткий курс . Джон Уайли и сыновья. ISBN 978-1-118-46029-0.
  20. ^ Аб Дули, Джон Ф. (2013). Краткая история криптологии и криптографических алгоритмов . Springer Science & Business Media. стр. 12–3. ISBN 9783319016283.
  21. ^ Кнут, Дональд Э. (1972). «Древние вавилонские алгоритмы» (PDF) . Коммун. АКМ . 15 (7): 671–677. дои : 10.1145/361454.361514. ISSN  0001-0782. S2CID  7829945. Архивировано из оригинала (PDF) 24 декабря 2012 г.
  22. ^ Аабо, Асгер (2001). Эпизоды из ранней истории астрономии . Нью-Йорк: Спрингер. стр. 40–62. ISBN 978-0-387-95136-2.
  23. ^ Аст, Кортни. «Эратосфен». Государственный университет Уичито: факультет математики и статистики. Архивировано из оригинала 27 февраля 2015 года . Проверено 27 февраля 2015 г.
  24. ^ Болтер 1984:24
  25. ^ Болтер 1984:26
  26. ^ Болтер 1984: 33–34, 204–206.
  27. ^ Диаграмма Белла и Ньюэлла 1971:39, ср. Дэвис 2000
  28. ^ Мелина Хилл, корреспондент Valley News, Тинкерер получает место в истории , Valley News Западный Ливан, штат Нью-Хэмпшир, четверг, 31 марта 1983 г., стр. 13.
  29. ^ Дэвис 2000:14
  30. ^ Клини 1943 в Дэвисе 1965: 274
  31. ^ Россер 1939 в Дэвисе 1965: 225
  32. ^ abcd Sipser 2006: 157
  33. ^ см. Таусворт, 1977 г.
  34. ^ Кригель, Ганс-Петер ; Шуберт, Эрих; Зимек, Артур (2016). «(Черное) искусство оценки во время выполнения: сравниваем ли мы алгоритмы или реализации?». Знания и информационные системы . 52 (2): 341–378. дои : 10.1007/s10115-016-1004-2. ISSN  0219-1377. S2CID  40772241.
  35. ^ Джиллиан Конахан (январь 2013 г.). «Лучшая математика делает сети передачи данных быстрее». Discovermagazine.com. Архивировано из оригинала 13 мая 2014 года . Проверено 13 мая 2014 г.
  36. ^ Хайтам Хассание, Петр Индик , Дина Катаби и Эрик Прайс, «Симпозиум ACM-SIAM по дискретным алгоритмам (SODA). Архивировано 4 июля 2013 г., в Wayback Machine , Киото, январь 2012 г. См. Также веб-страницу sFFT, архивированную 21 февраля. , 2012 год, в Wayback Machine .
  37. ^ Гудрич, Майкл Т .; Тамассия, Роберто (2002). Разработка алгоритмов: основы, анализ и примеры из Интернета. Джон Уайли и сыновья, Inc. ISBN 978-0-471-38365-9. Архивировано из оригинала 28 апреля 2015 года . Проверено 14 июня 2018 г.
  38. ^ «Обозначение Big-O (статья) | Алгоритмы» . Ханская академия . Проверено 3 июня 2024 г.
  39. ^ Джон Г. Кемени и Томас Э. Курц, 1985 г. «Возвращение к основам: история, коррупция и будущее языка» , Addison-Wesley Publishing Company, Inc. Ридинг, Массачусетс, ISBN 0-201-13433-0
  40. ^ Таусворт 1977: 101
  41. ^ Таусворт 1977: 142
  42. ^ Кнут 1973, раздел 1.2.1, расширенный Таусвортом 1977 на стр. 100 и далее и в главе 9.1.
  43. ^ «Эксперты: поощряет ли патентная система инновации?» Журнал "Уолл Стрит . 16 мая 2013 г. ISSN  0099-9660 . Проверено 29 марта 2017 г.
  44. ^ Келлерер, Ганс; Пферши, Ульрих; Пизингер, Дэвид (2004). Проблемы с рюкзаком | Ганс Келлерер | Спрингер. Спрингер. дои : 10.1007/978-3-540-24777-7. ISBN 978-3-540-40286-2. S2CID  28836720. Архивировано из оригинала 18 октября 2017 года . Проверено 19 сентября 2017 г.
  45. ^ Например, объем выпуклого многогранника (описанного с помощью оракула членства) может быть аппроксимирован с высокой точностью с помощью алгоритма рандомизированного полиномиального времени, но не детерминированного: см. Дайер, Мартин; Фриз, Алан; Каннан, Рави (январь 1991 г.). «Случайный полиномиальный алгоритм аппроксимации объема выпуклых тел». Дж. АКМ . 38 (1): 1–17. CiteSeerX 10.1.1.145.4600 . дои : 10.1145/102782.102783. S2CID  13268711. 
  46. ^ Джордж Б. Данциг и Мукунд Н. Тапа. 2003. Линейное программирование 2: теория и расширения . Спрингер-Верлаг.

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

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

Внешние ссылки

Хранилища алгоритмов