Точный набор инструкций описывающих порядок действий исполнителя для достижения результата

http://profbeckman.narod.ru/

Профессор

Игорь Н. Бекман

КОМПЬЮТЕРНЫЕ НАУКИ

Курс лекций

Лекция 7. АЛГОРИТМЫ

Содержание

1

1.1

Определение понятий

1

1.2

История термина

4

1.3

Виды алгоритмов

6

1.3

Исполнитель алгоритмов

7

1.4

Алгоритмический язык

9

2. ТЕОРИЯ АЛГОРИТМОВ

11

2.1

Возникновение теории алгоритмов

11

2.2

Анализ трудоёмкости алгоритмов

12

2.3

Объекты алгоритмов

13

2.4

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

14

2.5

Машина Поста

16

2.6

Алгоритмически неразрешимые задачи и вычислимые функции

16

2.7

Понятие сложности алгоритма

17

2.8

Анализ алгоритмов поиска

18

3. АЛГОРИТМЫ В КОМПЬЮТЕРЕ

20

Теория алгоритмов – одно из основных понятий математики и информатики. Даже происхождение самого термина «алгоритм» связано с математикой. Известно, что основная особенность всех вычислений машины состоит в том, что в основе её работы лежит программный принцип управления. Это означает, что для решения как самой простой, так и самой сложной задачи пользователю необходимо использовать перечень инструкций или команд, следуя которым шаг за шагом компьютер выдаст необходимый результат. Таким образом, для того, чтобы решать задачу на компьютере, её необходимо сначала алгоритмизировать. Именно алгоритмический принцип и лежит в основе работы всех компьютеров.

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

1. АЛГОРИТМ

1.1Определение понятий

Встарой трактовке алгори́тм— точный набор инструкций, описывающих последовательность действий исполнителя для достижения результата решения задачи за конечное время. По мере развития параллельности в работе компьютеров слово «последовательность» стали заменять более общим словом «порядок». Это связано с тем, что какие-то действия алгоритма должны быть выполнены только друг за другом, но какие-то могут быть и независимыми. Часто в качестве исполнителя выступает некоторый механизм (компьютер, токарный станок, швейная машина), но понятие алгоритма необязательно относится к компьютерным программам, так, например, чётко описанный рецепт приготовления блюда также является алгоритмом, в таком случае исполнителем является человек.

Единого «истинного» определения понятия «алгоритм» нет.

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

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

http://profbeckman.narod.ru/

Алгоритм — последовательность действий, направленных на получение определённого результата за конечное число шагов».

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

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

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

Любой алгоритм существует не сам по себе, а предназначен для определённого исполнителя. Алгоритм описывается в командах исполнителя, который это алгоритм будет выполнять. Объекты, над которыми исполнитель может совершать действия, образуют среду исполнителя. Исходные данные и результаты любого алгоритма всегда принадлежат среде того исполнителя, для которого предназначен алгоритм.

Значение слова «алгоритм»очень схоже со значением слов «рецепт», «метод», способ. Однако любой алгоритм, в отличие от рецепта или способа, обязательно обладает следующими свойствами: Дискретность — алгоритм должен представлять процесс решения задачи как последовательное выполнение некоторых простых шагов. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, т. е. преобразование исходных данных в результат осуществляется во времени дискретно. Можно считать, что шаги выполняются мгновенно в моменты времени t0, t1, t2…, а между этими моментами ничего не происходит.

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

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

Понятность — алгоритм для исполнителя должен включать только те команды, которые ему (исполнителю) доступны, которые входят в его систему команд.

Завершаемость (конечность, определённость) — при корректно заданных исходных данных алгоритм должен завершать работу и выдавать результат за конечное число шагов. С другой стороны, вероятностный алгоритм может и никогда не выдать результат, но вероятность этого равна 0.

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

Массовость — алгоритм должен быть применим к разным наборам исходных данных.

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

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

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

Алгоритм всегда рассчитан на выполнение «неразмышляющим» исполнителем.

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

http://profbeckman.narod.ru/

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

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

Замечание об определенности и конечности: иногда считают, что алгоритм может заканчиваться без получения результата (безрезультатная остановка) или даже не заканчиваться вовсе при некоторых исходных данных (неприменимость к этим исходным данным). Взгляд на это с точки зрения теории — машины Тьюринга — обсудим позже. С практической точки зрения такая ситуация тоже требует внимания: операционная система (ОС) вычислительной машины, являясь совокупностью алгоритмов, при нормальной работе не предполагает остановки и выдачи каких-либо результатов; она лишь добросовестно получает периодически входные данные-задания и запускает их; задания-алгоритмы сами получают результаты. Таким образом, ОС не выдаёт продукции, если не считать протокола её работы. Другие диалоговые программные системы также требуют для своего описания более широкой интерпретации понятия алгоритма: они не получают входные данные сразу и не всегда можно говорить об априорной ограниченности объёма данных некоторой константой. Однако все сказанное не умаляет важности приведённого понятия алгоритма, а говорит лишь о богатстве проблематики компьютерных наук.

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

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

Для каждого исполнителя набор допустимых действий всегда ограничен – не может существовать исполнителя, для которого любое действие является допустимым. Перефразируя И.Канта: «Если бы такой исполнитель существовал, то среди его допустимых действий было бы создание такого камня, который он не может поднят. Но это противоречит допустимости действия «поднять любой камень».

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

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

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

Пример 1. Проверка на примере текста (отыскание максимального и минимального элементов массива):

«Исходные данные — положительное число N, определяющее количество элементов массива A, и целочисленные элементы A[1], A[2], …, A[N] массива A. Значения всех чисел находятся в пределах непосредственно представимых в вычислительной машине. Кроме исходных данных вводятся целочисленные переменные Max, Min, i. Первые две по окончании работы алгоритма определяют его результаты, третья является вспомогательной. Действия алгоритма состоят в выполнении следующих шагов:

1.Установить значения Мах = A[1], Min = A[1], i = 2.

2.Пока i <= N повторять шаги с 3 по 5.

3.Если Мах < A[i], то положить Мах = A[i].

4.Если Мin > A[i], то положить Мin = A[i].

http://profbeckman.narod.ru/

5.Увеличить i на 1.

6.Вывести результаты Мах и Min.

7.Остановиться».

Проверим выполнение основных свойств.

Дискретность очевидна.

Элементарность шагов. Шаг 1 содержит три присваивания значений; шаг 2 содержит одно сравнение чисел; шаги 3- 5 содержат два сравнения чисел, два присваивания значений (выполняется каждый раз только одно из них), одно увеличение значения на единицу; шаг 6 — вывод на экран или на печать данных ограниченного объема.

Определенность. Каждый шаг и алгоритм в целом заканчивается определенным результатом; строго определена последовательность шагов.

Конечность. Шаги 1 и 6 выполняются по одному разу. Количество выполнений шагов 2-5 зависит от значений переменной i и уровня N. Поскольку i монотонно возрастает, то ее значение достигнет уровня N через конечное число шагов. Если начальное значение переменной i больше уровня N, то шаг 2 выполняется один раз, а шаги 3-5 не выполняется ни разу. Таким образом, в любом случае выполнение алгоритма завершится через конечное число шагов.

Массовость. Алгоритм может воспринимать в качестве исходных данных различные массивы разной длины.

Однако не всегда так легко доказать выполнимость основных свойств алгоритма. Особенно это касается свойства конечности. Рассмотрим, например, алгоритм с одним входным аргументом — натуральным числом k.

1.Если k = 1, то остановиться.

2.Если k четное, то положить k = k/2; если k нечетное, то положить k = 3k+1.

3.Повторить, используя новое значение k.

Как следует из текста алгоритма, имеется некоторый процесс изменения значения k, начинающийся

с определенного начального значения, затем на каждом шаге k либо увеличивается, либо уменьшается и, наконец, возможно, приходит к значению 1, на котором и останавливается. В общем случае процесс немонотонный. Например, для k = 40: k = 40, 20, 10, 5, 16, 8, 4, 2, 1 (8 шагов). Решить вопрос о конечности данного алгоритма — это значит доказать одно из двух утверждений: для любого k процесс заканчивается единицей; для некоторого k процесс не заканчивается.

Если k равно степени двойки (2, 4, 8, 16, 32, …), то процесс будет монотонно убывающим и завершится за число шагов, равное этой степени. В противном случае на некотором промежуточном шаге значение k станет нечётным, но не равным единице, и на следующем шаге значение k увеличится. Оба варианта (алгоритм заканчивается, алгоритм не заканчивается) не кажутся очевидными. С одной стороны, увеличение k происходит в три раза, а уменьшение только в два раза и, если шаги увеличения и уменьшения строго чередуются, то для такого процесса имеется общая тенденция к возрастанию. С другой стороны, за шагом увеличения обязательно следует шаг уменьшения, но обратное неверно, т. е. шагов уменьшения может быть и больше, чем шагов увеличения. Потенциально возможно также зацикливание процесса, когда на очередном шаге получается уже встречавшееся ранее значение. Вот типичный пример с чередованием шагов: k = 127, 382, 191, 574, 287, 862, 431, 1294, 647, 1942, 971, 2914, 1457, 4372, 2186, 1093, 3280, 1640, 820, 410, 205, 616, 308, 154, 77, 232, 116, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.

До значения k = 4372 шаги строго чередуются, затем начинается отрезок нерегулярного изменения, на котором имеется 20 четных и 8 нечетных чисел, и заканчивается процесс «хвостом» из степеней двойки. Можно показать, что для всех нечетных k = 2j — 1 или даже для k = n2j — 1, где n — нечётное натуральное число, начальный участок последовательности является строго чередующимся до достижения величины 2(n3j — 1); причем длина участка строгого чередования шагов пропорциональна величине j. Это плохая тенденция, поскольку k удаляется от 1. С другой стороны, для многих сочетаний n и j величина n3j — 1 = m2p — пропорциональна степени двойки. В этом случае вслед за возрастанием k идёт группа операций деления на 2, «сбрасывающая» значение k до величины m. В целом вопрос о конечности этого алгоритма должен решаться методами теории чисел. Несмотря на ряд усилий, предпринимавшихся математиками, решение пока не найдено.

1.2 История термина

Современное формальное определение алгоритма было дано в 30-50-х годы XX века в работах Тьюринга, Поста, Чёрча (тезис Чёрча — Тьюринга), Н. Винера, А.А.Маркова.

Само слово «алгоритм» происходит от имени учёного Абу Абдуллах Мухаммеда ибн Муса альХорезми. В 825 он написал сочинение, в котором впервые дал описание придуманной в Индии позиционной десятичной системы счисления. Аль-Хорезми сформулировал правила вычислений в новой

http://profbeckman.narod.ru/

системе и, вероятно, впервые использовал цифру 0 для обозначения пропущенной позиции в записи числа (её индийское название арабы перевели как as-sifr или просто sifr, отсюда такие слова, как «цифра» и «шифр»). Приблизительно в это же время индийские цифры начали применять и другие арабские учёные. В первой половине XII века книга аль-Хорезми в латинском переводе проникла в Европу. Переводчик дал ей название Algoritmi de numero Indorum («Алгоритми о счёте индийском»). По-арабски же книга именовалась Китаб аль-джебр валь-мукабала («Книга о сложении и вычитании»). Из оригинального названия книги происходит слово Алгебра.

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

Алгоритм — это искусство счёта с помощью цифр, но поначалу слово «цифра» относилось только к нулю. Знаменитый французский трувер Готье де Куанси (Gautier de Coincy, 1177-1236) в одном из стихотворений использовал слова algorismus-cipher (которые означали цифру 0) как метафору для характеристики абсолютно никчёмного человека. Очевидно, понимание такого образа требовало соответствующей подготовки слушателей, а это означает, что новая система счисления уже была им достаточно хорошо известна.

Многие века абак был фактически единственным средством для практичных вычислений, им пользовались и купцы, и менялы, и учёные. Достоинства вычислений на счётной доске разъяснял в своих сочинениях такой выдающийся мыслитель, как Герберт Аврилакский (938—1003), ставший в 999 папой римским под именем Сильвестра II. Новое с огромным трудом пробивало себе дорогу, и в историю математики вошло упорное противостояние лагерей абацистов и алгорисмиков, которые пропагандировали использование для вычислений абака вместо арабских цифр. Прошло не одно столетие, прежде чем новый способ счёта окончательно утвердился, столько времени потребовалось, чтобы выработать общепризнанные обозначения, усовершенствовать и приспособить к записи на бумаге методы вычислений.

ВЗападной Европе учителей арифметики вплоть до XVII века продолжали называть «магистрами абака», как, например, математика Никколо Тарталью (1500—1557).

Итак, сочинения по искусству счёта назывались Алгоритмами. Из многих сотен можно выделить и такие необычные, как написанный в стихах трактат «Carmen de Algorismo» (латинское carmen и означает стихи) Александра де Вилла Деи, ум. 1240) или учебник венского астронома и математика Георга Пурбаха (1423-1461) «Opus algorismi jocundissimi» («Веселейшее сочинение по алгоритму»). Постепенно значение слова расширялось. Учёные начинали применять его не только к сугубо вычислительным, но и к другим математическим процедурам. Например, в 1360 французский философ Николай Орем (1323/25-1382) написал математический трактат «Algorismus proportionum» («Вычисление пропорций»), в котором впервые использовал степени с дробными показателями и фактически вплотную подошёл к идее логарифмов. Когда же на смену абаку пришёл так называемый счёт на линиях, многочисленные руководства по нему стали называть «Algorithmus linealis», то есть правила счёта на линиях. Можно обратить внимание на то, что первоначальная форма algorismi спустя какое-то время потеряла последнюю букву, и слово приобрело более удобное для европейского произношения вид algorism. Позднее и оно подверглось искажению связанному со словом arithmetic.

В1684 Готфрид Лейбниц в сочинении «Nova Methodvs pro maximis et minimis, itemque tangentibus…»

впервые использовал слово «алгоритм» (Algorithmo) в ещё более широком смысле: как систематический способ решения проблем дифференциального исчисления. В XVIII веке в одном из германских математических словарей, Vollstandiges mathematisches Lexicon (изданном в Лейпциге в 1747), термин algorithmus всё ещё объясняется как понятие о четырёх арифметических операциях. Но такое значение не было единственным, ведь терминология математической науки в те времена ещё только формировалась. В частности, выражение algorithmus infinitesimalis применялось к способам выполнения действий с бесконечно малыми величинами. Пользовался словом алгоритм и Леонард Эйлер, одна из работ которого так и называется- «Использование нового алгоритма для решения проблемы Пелля. Понимание Эйлером алгоритма как синонима способа решения задачи уже очень близко к современному.

Однако потребовалось ещё почти два столетия, чтобы все старинные значения слова вышли из употребления. Этот процесс можно проследить на примере проникновения слова «алгоритм» в русский язык.

Историки датируют 1691 годом один из списков древнерусского учебника арифметики, известного как «Счётная мудрость». Это сочинение известно во многих вариантах (самые ранние из них почти на сто

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Материал из MachineLearning.

Перейти к: навигация, поиск

Содержание

  • 1 Общие определения
    • 1.1 Формальные признаки алгоритмов
  • 2 Алгоритмы анализа данных
  • 3 Литература
  • 4 Ссылки

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

Общие определения

Единого «истинного» определения понятия «алгоритм» нет.
Наиболее известные варианты определения опираются на интуитивное понятие «задачи»:

  • Алгоритм — это конечный набор правил, который определяет последовательность операций для решения конкретного множества задач и обладает пятью важными чертами: конечность, определённость, ввод, вывод, эффективность (Д. Э. Кнут).
  • Алгоритм — это всякая система вычислений, выполняемых по строго определённым правилам, которая после какого-либо числа шагов заведомо приводит к решению поставленной задачи (А. Н. Колмогоров).
  • Алгоритм — это последовательность действий, либо приводящяя к решению задачи, либо поясняющая, почему это решение получить нельзя.

Формальные признаки алгоритмов

  • Детерминированность: в каждый момент времени следующий шаг работы однозначно определяется состоянием исполнителя. Алгоритм выдаёт один и тот же результат (ответ) для одних и тех же исходных данных.
  • Понятность: алгоритм должен включать только команды из заранее оговоренной системы команд исполнителя.
  • Завершаемость (конечность): при корректно заданных исходных данных алгоритм должен завершать работу и выдавать результат за конечное число шагов.
  • Массовость: алгоритм должен быть применим к разным наборам исходных данных.

Алгоритмы анализа данных

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

В машинном обучении понятие алгоритм может употреблять в трёх смыслах.

Литература

  1. Рудаков, К. В. Алгебраическая теория универсальных и локальных ограничений для алгоритмов распознавания: Дис. док. физ.-мат. наук: 05-13-17. — Вычислительный центр АН СССР, 1992. — 274 с.  (подробнее)

Ссылки

  • Алгоритм — Википедия (русский).
  • Algorithm — Wikipedia (english).

Алгори́тм — набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное число действий. В старой трактовке вместо слова «порядок» использовалось слово «последовательность», но по мере развития параллельности в работе компьютеров слово «последовательность» стали заменять более общим словом «порядок». Это связано с тем, что работа каких-то инструкций алгоритма может быть зависима от других инструкций или результатов их работы. Таким образом, некоторые инструкции должны выполняться строго после завершения работы инструкций, от которых они зависят. Независимые инструкции или инструкции, ставшие независимыми из-за завершения работы инструкций, от которых они зависят, могут выполняться в произвольном порядке, параллельно или одновременно, если это позволяют используемые процессор и операционная система.

Ранее часто писали «алгорифм», сейчас такое написание используется редко, но, тем не менее, имеет место (например, Нормальный алгорифм Маркова).

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

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

Частичная формализация понятия алгоритма началась с попыток решения проблемы разрешения (нем. Entscheidungsproblem), которую сформулировал Давид Гильберт в 1928 году. Следующие этапы формализации были необходимы для определения эффективных вычислений[1] или «эффективного метода»[2]; среди таких формализаций — рекурсивные функции Геделя — Эрбрана — Клини 1930, 1934 и 1935 гг., λ-исчисление Алонзо Чёрча 1936 г., «Формулировка 1» Эмиля Поста 1936 года и машина Тьюринга. В методологии алгоритм является базисным понятием и получает качественно новое понятие как оптимальности по мере приближения к прогнозируемому абсолюту. В современном мире алгоритм в формализованном выражении составляет основу образования на примерах, по подобию. На основе сходства алгоритмов различных сфер деятельности была сформирована концепция (теория) экспертных систем.

Содержание

  • 1 История термина
  • 2 Определения алгоритма
    • 2.1 Формальное определение
      • 2.1.1 Машина Тьюринга
      • 2.1.2 Рекурсивные функции
      • 2.1.3 Нормальный алгоритм Маркова
    • 2.2 Стохастические алгоритмы
    • 2.3 Другие формализации
  • 3 Формальные свойства алгоритмов
  • 4 Виды алгоритмов
  • 5 Нумерация алгоритмов
  • 6 Алгоритмически неразрешимые задачи
  • 7 Анализ алгоритмов
    • 7.1 Время работы
  • 8 Наличие исходных данных и некоторого результата
  • 9 Представление алгоритмов
  • 10 Эффективность алгоритмов
  • 11 Пример
  • 12 См. также
  • 13 Примечания
  • 14 Литература
  • 15 Ссылки

История термина

Страница из «Алгебры» аль-Хорезми — хорезмского математика, от имени которого происходит слово алгоритм.

Современное формальное определение алгоритма было дано в 30—50-е годы XX века в работах Тьюринга, Поста, Чёрча (тезис Чёрча — Тьюринга), Н. Винера, А. А. Маркова.

Само слово «алгоритм» происходит от имени хорезмского учёного Абу Абдуллах Мухаммеда ибн Муса аль-Хорезми (алгоритм — аль-Хорезми). Около 825 года он написал сочинение, в котором впервые дал описание придуманной в Индии позиционной десятичной системы счисления. К сожалению, персидский оригинал книги не сохранился. Аль-Хорезми сформулировал правила вычислений в новой системе и, вероятно, впервые использовал цифру 0 для обозначения пропущенной позиции в записи числа (её индийское название арабы перевели как as-sifr или просто sifr, отсюда такие слова, как «цифра» и «шифр»). Приблизительно в это же время индийские цифры начали применять и другие арабские учёные. В первой половине XII века книга аль-Хорезми в латинском переводе проникла в Европу. Переводчик, имя которого до нас не дошло, дал ей название Algoritmi de numero Indorum («Алгоритмы о счёте индийском»). По-арабски же книга именовалась Китаб аль-джебр валь-мукабала («Книга о сложении и вычитании»). Из оригинального названия книги происходит слово Алгебра (алгебра — аль-джебр — восполнение).

Таким образом, мы видим, что латинизированное имя среднеазиатского учёного было вынесено в заглавие книги, и сегодня считается, что слово «алгоритм» попало в европейские языки именно благодаря этому сочинению. Однако вопрос о его смысле длительное время вызывал ожесточённые споры. На протяжении многих веков происхождению слова давались самые разные объяснения.

Одни выводили algorism из греческих algiros (больной) и arithmos (число). Из такого объяснения не очень ясно, почему числа именно «больные». Или же лингвистам больными казались люди, имеющие несчастье заниматься вычислениями? Своё объяснение предлагал и энциклопедический словарь Брокгауза и Ефрона. В нём алгорифм (кстати, до революции использовалось написание алгориѳм, через фиту) производится «от арабского слова Аль-Горетм, то есть корень». Разумеется, эти объяснения вряд ли можно счесть убедительными.

Упомянутый выше перевод сочинения аль-Хорезми стал первой ласточкой, и в течение нескольких следующих столетий появилось множество других трудов, посвящённых всё тому же вопросу — обучению искусству счёта с помощью цифр. И все они в названии имели слово algoritmi или algorismi.

Про аль-Хорезми позднейшие авторы ничего не знали, но поскольку первый перевод книги начинается словами: «Dixit algorizmi: …» («Аль-Хорезми говорил: …»), всё ещё связывали это слово с именем конкретного человека. Очень распространённой была версия о греческом происхождении книги. В англо-норманнской рукописи XIII века, написанной в стихах, читаем:

Алгоризм был придуман в Греции. Это часть арифметики. Придуман он был мастером по имени Алгоризм, который дал ему своё имя. И поскольку его звали Алгоризм, Он назвал свою книгу «Алгоризм».

Около 1250 года английский астроном и математик Иоанн Сакробоско написал труд по арифметике Algorismus vulgaris, на столетия ставший основным учебником по вычислениям в десятичной позиционной системе счисления во многих европейских университетах. Во введении Сакробоско назвал автором науки о счёте мудреца по имени Алгус (Algus). А в популярной средневековой поэме «Роман о Розе» (1275—1280) Жана де Мена «греческий философ Алгус» ставится в один ряд с Платоном, Аристотелем, Евклидом и Птолемеем! Встречался также вариант написания имени Аргус (Argus). И хотя, согласно древнегреческой мифологии, корабль «Арго» был построен Ясоном, именно этому Арго приписывалось строительство корабля.

«Мастер Алгус» (или Аргус) стал в средневековой литературе олицетворением счётного искусства. И в уже упоминавшейся «Романе о розе», и в известной итальянской поэме «Цветок», написанной Дуранте, имеются фрагменты, в которых говорится, что даже «mestre Argus» не сумеет подсчитать, сколько раз ссорятся и мирятся влюблённые. Английский поэт Джефри Чосер в поэме «Книга герцогини» (1369 г.) пишет, что даже «славный счётчик Аргус» (noble countour Argu) не сможет счесть чудовищ, явившихся в кошмарных видениях герою.

Впрочем, греческая версия была не единственной. Мифический АлГор (Algor) именовался то королём Кастилии (Rex quodam Castelliae), то индийским королём, то арабским мудрецом (philosophus Algus nomine Arabicus), то египетским божеством. Соответственно АлГорРитм — это ритм (порядок) бога Гора (АлГора).

Баронесса Ада Лавлейс, которую считают первым программистом.

Однако со временем такие объяснения всё менее занимали математиков, и слово algorism (или algorismus), неизменно присутствовавшее в названиях математических сочинений, обрело значение способа выполнения арифметических действий посредством арабских цифр, то есть на бумаге, без использования абака. Именно в таком значении оно вошло во многие европейские языки. Например, с пометкой «устар.» оно присутствует в представительном словаре английского языка Webster’s New World Dictionary, изданном в 1957 г.

Алгоритм — это искусство счёта с помощью цифр, но поначалу слово «цифра» относилось только к нулю. Знаменитый французский трувер Готье де Куанси (Gautier de Coincy, 1177—1236) в одном из стихотворений использовал слова algorismus-cipher (которые означали цифру 0) как метафору для характеристики абсолютно никчёмного человека. Очевидно, понимание такого образа требовало соответствующей подготовки слушателей, а это означает, что новая система счисления уже была им достаточно хорошо известна.

Многие века абак был фактически единственным средством для практичных вычислений, им пользовались и купцы, и менялы, и учёные. Достоинства вычислений на счётной доске разъяснял в своих сочинениях такой выдающийся мыслитель, как Герберт Аврилакский (938—1003), ставший в 999 г. папой римским под именем Сильвестра II. Новое с огромным трудом пробивало себе дорогу, и в историю математики вошло упорное противостояние лагерей алгорисмиков и абацистов (иногда называемых гербекистами), которые пропагандировали использование для вычислений абака вместо арабских цифр. Интересно, что известный французский математик Николя Шюке (Nicolas Chuquet, 1445—1488) в реестр налогоплательщиков города Лиона был вписан как алгорисмик (algoriste). Но прошло не одно столетие, прежде чем новый способ счёта окончательно утвердился, столько времени потребовалось, чтобы выработать общепризнанные обозначения, усовершенствовать и приспособить к записи на бумаге методы вычислений. В Западной Европе учителей арифметики вплоть до XVII века продолжали называть «магистрами абака», как, например, математика Никколо Тарталью (1500—1557).

Итак, сочинения по искусству счёта назывались Алгоритмами. Из многих сотен можно выделить и такие необычные, как написанный в стихах трактат Carmen de Algorismo (латинское carmen и означает стихи) Александра де Вилла Деи (Alexander de Villa Dei, ум. 1240) или учебник венского астронома и математика Георга Пурбаха (Georg Peurbach, 1423—1461) Opus algorismi jocundissimi («Веселейшее сочинение по алгоритму»).

Постепенно значение слова расширялось. Учёные начинали применять его не только к сугубо вычислительным, но и к другим математическим процедурам. Например, около 1360 г. французский философ Николай Орем (Nicolaus Oresme, 1323/25-1382) написал математический трактат Algorismus proportionum («Вычисление пропорций»), в котором впервые использовал степени с дробными показателями и фактически вплотную подошёл к идее логарифмов. Когда же на смену абаку пришёл так называемый счёт на линиях, многочисленные руководства по нему стали называть Algorithmus linealis, то есть правила счёта на линиях.

Можно обратить внимание на то, что первоначальная форма algorismi спустя какое-то время потеряла последнюю букву, и слово приобрело более удобное для европейского произношения вид algorism. Позднее и оно, в свою очередь, подверглось искажению, скорее всего, связанному со словом arithmetic.

В 1684 году Готфрид Лейбниц в сочинении Nova Methodvs pro maximis et minimis, itemque tangentibus… впервые использовал слово «алгоритм» (Algorithmo) в ещё более широком смысле: как систематический способ решения проблем дифференциального исчисления.

В XVIII веке в одном из германских математических словарей, Vollstandiges mathematisches Lexicon (изданном в Лейпциге в 1747 г.), термин algorithmus всё ещё объясняется как понятие о четырёх арифметических операциях. Но такое значение не было единственным, ведь терминология математической науки в те времена ещё только формировалась. В частности, выражение algorithmus infinitesimalis применялось к способам выполнения действий с бесконечно малыми величинами. Пользовался словом алгоритм и Леонард Эйлер, одна из работ которого так и называется — «Использование нового алгоритма для решения проблемы Пелля» (De usu novi algorithmi in problemate Pelliano solvendo). Мы видим, что понимание Эйлером алгоритма как синонима способа решения задачи уже очень близко к современному.

Однако потребовалось ещё почти два столетия, чтобы все старинные значения слова вышли из употребления. Этот процесс можно проследить на примере проникновения слова «алгоритм» в русский язык.

Историки датируют 1691 годом один из списков древнерусского учебника арифметики, известного как «Счётная мудрость». Это сочинение известно во многих вариантах (самые ранние из них почти на сто лет старше) и восходит к ещё более древним рукописям XVI в. По ним можно проследить, как знание арабских цифр и правил действий с ними постепенно распространялось на Руси. Полное название этого учебника — «Сия книга, глаголемая по еллински и по гречески арифметика, а по немецки алгоризма, а по русски цифирная счётная мудрость».

Таким образом, слово «алгоритм» понималось первыми русскими математиками так же, как и в Западной Европе. Однако его не было ни в знаменитом словаре В. И. Даля, ни спустя сто лет в «Толковом словаре русского языка» под редакцией Д. Н. Ушакова (1935 г.). Зато слово «алгорифм» можно найти и в популярном дореволюционном Энциклопедическом словаре братьев Гранат, и в первом издании Большой советской энциклопедии (БСЭ), изданном в 1926 г. И там, и там оно трактуется одинаково: как правило, по которому выполняется то или иное из четырёх арифметических действий в десятичной системе счисления. Однако к началу XX в. для математиков слово «алгоритм» уже означало любой арифметический или алгебраический процесс, выполняемый по строго определённым правилам, и это объяснение также даётся в следующих изданиях БСЭ.

Алгоритмы становились предметом всё более пристального внимания учёных, и постепенно это понятие заняло одно из центральных мест в современной математике. Что же касается людей, от математики далёких, то к началу сороковых годов это слово они могли услышать разве что во время учёбы в школе, в сочетании «алгоритм Евклида». Несмотря на это, алгоритм всё ещё воспринимался как термин сугубо специальный, что подтверждается отсутствием соответствующих статей в менее объёмных изданиях. В частности, его нет даже в десятитомной Малой советской энциклопедии (1957 г.), не говоря уже об однотомных энциклопедических словарях. Но зато спустя десять лет, в третьем издании Большой советской энциклопедии (1969 г.) алгоритм уже характеризуется как одна из основных категорий математики, «не обладающих формальным определением в терминах более простых понятий, и абстрагируемых непосредственно из опыта». Как мы видим, отличие даже от трактовки первым изданием БСЭ разительное! За сорок лет алгоритм превратился в одно из ключевых понятий математики, и признанием этого стало включение слова уже не в энциклопедии, а в словари. Например, оно присутствует в академическом «Словаре русского языка» (1981 г.) именно как термин из области математики.

Одновременно с развитием понятия алгоритма постепенно происходила и его экспансия из чистой математики в другие сферы. И начало ей положило появление компьютеров, благодаря которому слово «алгоритм» вошло в 1985 г. во все школьные учебники информатики и обрело новую жизнь. Вообще можно сказать, что его сегодняшняя известность напрямую связана со степенью распространения компьютеров. Например, в третьем томе «Детской энциклопедии» (1959 г.) о вычислительных машинах говорится немало, но они ещё не стали чем-то привычным и воспринимаются скорее как некий атрибут светлого, но достаточно далёкого будущего. Соответственно и алгоритмы ни разу не упоминаются на её страницах. Но уже в начале 70-х гг. прошлого столетия, когда компьютеры перестали быть экзотической диковинкой, слово «алгоритм» стремительно входит в обиход. Это чутко фиксируют энциклопедические издания. В «Энциклопедии кибернетики» (1974 г.) в статье «Алгоритм» он уже связывается с реализацией на вычислительных машинах, а в «Советской военной энциклопедии» (1976 г.) даже появляется отдельная статья «Алгоритм решения задачи на ЭВМ». За последние полтора-два десятилетия компьютер стал неотъемлемым атрибутом нашей жизни, компьютерная лексика становится всё более привычной. Слово «алгоритм» в наши дни известно, вероятно, каждому. Оно уверенно шагнуло даже в разговорную речь, и сегодня мы нередко встречаем в газетах и слышим в выступлениях политиков выражения вроде «алгоритм поведения», «алгоритм успеха» или даже «алгоритм предательства». Академик Н. Н. Моисеев назвал свою книгу «Алгоритмы развития», а известный врач Н. М. Амосов — «Алгоритм здоровья» и «Алгоритмы разума». А это означает, что слово живёт, обогащаясь всё новыми значениями и смысловыми оттенками.

Определения алгоритма

Формальное определение

Разнообразные теоретические проблемы математики и ускорение развития физики и техники поставили на повестку дня точное определение понятия алгоритма.

Первые попытки уточнения понятия алгоритма и его исследования осуществляли в первой половине XX века Алан Тьюринг, Эмиль Пост, Жак Эрбран, Курт Гедель, А. А. Марков, Алонзо Чёрч. Было разработано несколько определений понятия алгоритма, но впоследствии было выяснено, что все они определяют одно и то же понятие (см. Тезис Чёрча — Тьюринга)[3]

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

Схематическая иллюстрация работы машины Тьюринга.

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

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

Этот тезис является аксиомой, постулатом, и не может быть доказан математическими методами, поскольку алгоритм не является точным математическим понятием.

Рекурсивные функции

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

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

Подобно тезису Тьюринга в теории вычислительных функций была выдвинута гипотеза, которая называется тезис Чёрча:

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

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

Нормальный алгоритм Маркова

Нормальный алгоритм Маркова — это система последовательных применений подстановок, которые реализуют определенные процедуры получения новых слов из базовых, построенных из символов некоторого алфавита. Как и машина Тьюринга, нормальные алгоритмы не выполняют самих вычислений: они лишь выполняют преобразование слов путем замены букв по заданным правилам[6].

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

Создатель теории нормальных алгоритмов А. А. Марков выдвинул гипотезу, которая получила название принцип нормализации Маркова:

Подобно тезисам Тьюринга и Черча, принцип нормализации Маркова не может быть доказан математическими средствами.

Стохастические алгоритмы

Однако, приведенное выше формальное определение алгоритма в некоторых случаях может быть слишком строгим. Иногда возникает потребность в использовании случайных величин[8]. Алгоритм, работа которого определяется не только исходными данными, но и значениями, полученными из генератора случайных чисел, называют стохастическим (или рандомизированным, от англ. randomized algorithm)[9]. Формально, такие алгоритмы нельзя называть алгоритмами, поскольку существует вероятность (близкая к нулю), что они не остановятся. Однако, стохастические алгоритмы часто бывают эффективнее детерминированных, а в отдельных случаях — единственным способом решить задачу[8].

На практике вместо генератора случайных чисел используют генератор псевдослучайных чисел.

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

Некоторые исследователи допускают возможность того, что стохастический алгоритм даст с некоторой заранее известной вероятностью неправильный результат. Тогда стохастические алгоритмы можно разделить на два типа[10]:

  • алгоритмы типа Лас-Вегас всегда дают корректный результат, но время их работы не определено.
  • алгоритмы типа Монте-Карло, в отличие от предыдущих, могут давать неправильные результаты с известной вероятностью (их часто называют методами Монте-Карло).

Другие формализации

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

  • многоленточная и недетерминированная машины Тьюринга;
  • регистровая и РАМ машина — прототип современных компьютеров и виртуальных машин;
  • конечные и клеточные автоматы

и другие.

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

Различные определения алгоритма в явной или неявной форме содержат следующий ряд общих требований:

  • Дискретность — алгоритм должен представлять процесс решения задачи как последовательное выполнение некоторых простых шагов. При этом для выполнения каждого шага алгоритма требуется конечный отрезок времени, то есть преобразование исходных данных в результат осуществляется во времени дискретно.
  • Детерминированность (определённость). В каждый момент времени следующий шаг работы однозначно определяется состоянием системы. Таким образом, алгоритм выдаёт один и тот же результат (ответ) для одних и тех же исходных данных. В современной трактовке у разных реализаций одного и того же алгоритма должен быть изоморфный граф. С другой стороны, существуют вероятностные алгоритмы, в которых следующий шаг работы зависит от текущего состояния системы и генерируемого случайного числа. Однако при включении метода генерации случайных чисел в список «исходных данных», вероятностный алгоритм становится подвидом обычного.
  • Понятность — алгоритм должен включать только те команды, которые доступны исполнителю и входят в его систему команд.
  • Завершаемость (конечность) — при корректно заданных исходных данных алгоритм должен завершать работу и выдавать результат за конечное число шагов.[источник не указан 713 дней] С другой стороны, вероятностный алгоритм может и никогда не выдать результат, но вероятность этого равна 0.
  • Массовость (универсальность). Алгоритм должен быть применим к разным наборам исходных данных.
  • Результативность — завершение алгоритма определёнными результатами.
  • Алгоритм содержит ошибки, если приводит к получению неправильных результатов либо не даёт результатов вовсе.
  • Алгоритм не содержит ошибок, если он даёт правильные результаты для любых допустимых исходных данных.

Виды алгоритмов

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

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

Нумерация алгоритмов

Нумерация алгоритмов играет важную роль в их исследовании и анализе[11]. Поскольку любой алгоритм можно задать в виде конечного слова (представить в виде конечной последовательности символов некоторого алфавита), а множество всех конечных слов в конечном алфавите счётное, то множество всех алгоритмов также счётное. Это означает существование взаимно однозначного отображения между множеством натуральных чисел и множеством алгоритмов, то есть возможность присвоить каждому алгоритму номер.

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

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

Алгоритмически неразрешимые задачи

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

Случай, когда результатом вычисления функции f является логическое выражение «истина» или «ложь» (или множество {0, 1}), называют задачей, которая может быть решаемой или нерешаемой в зависимости от вычислимости функции f[12].

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

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

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

Анализ алгоритмов

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

Использование математического аппарата для анализа алгоритмов и их реализаций называют формальными методами. Формальные методы предусматривают применение формальных спецификаций и, обычно, набора инструментов для синтаксического анализа и доказательства свойств спецификаций. Абстрагирование от деталей реализации позволяет установить свойства системы независимо от ее реализации. Кроме того, точность и однозначность математических утверждений позволяет избежать многозначности и неточности естественных языков[14].

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

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

Во время доказательства корректности сравнивают текст программы со спецификацией желаемого соотношения входных-выходных данных. Для доказательств типа Хоара эта спецификация имеет вид утверждений, которые называют предусловиями и постусловиями. В совокупности с самой программой, их еще называют тройкой Хоара. Эти утверждения записывают

P{Q}R

где P — это предусловие, что должно выполняться перед запуском программы Q, а R — постусловие, правильное после завершения работы программы.

Формальные методы были успешно применены для широкого круга задач, в частности: разработке электронных схем, искусственного интеллекта, автоматических систем на железной дороге, верификации микропроцессоров, спецификации стандартов и спецификации и верификации программ[17].

Время работы

Графики функций, приведенных в таблице ниже.

Распространенным критерием оценки алгоритмов является время работы и порядок роста продолжительности работы в зависимости от объема входных данных.[18]

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

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

Именно асимптотическая сложность определяет размер задач, которые алгоритм способен обработать. Например, если алгоритм обрабатывает входные данные размером n за время cn², где c — некоторая константа, то говорят, что временная сложность такого алгоритма O(n²).

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

Грубо говоря, анализ средней асимптотической временной сложности можно разделить на два типа: аналитический и статистический. Аналитический метод дает более точные результаты, но сложен в использовании на практике. Зато статистический метод позволяет быстрее осуществлять анализ сложных задач[19].

В следующей таблице приведены распространенные асимптотические сложности с комментариями[20].

Сложность Комментарий Примеры
O(1) Устойчивое время работы не зависит от размера задачи Ожидаемое время поиска в в хеш-таблице
O(log log n) Очень медленный рост необходимого времени Ожидаемое время работы интерполирующего поиска n элементов
O(log n) Логарифмический рост — удвоение размера задачи увеличивает время работы на постоянную величину Вычисление xn; Двоичный поиск в массиве из n элементов
O(n) Линейный рост — удвоение размера задачи удвоит и необходимое время Сложение/вычитание чисел из n цифр; Линейный поиск в массиве из n элементов
O(n log n) Линеаритмичный рост — удвоение размера задачи увеличит необходимое время чуть более чем вдвое Сортировка слиянием или кучей n элементов; нижняя граница сортировки сопоставлением n элементов
O(n²) Квадратичный рост — удвоение размера задачи увеличивает необходимое время в четыре раза Элементарные алгоритмы сортировки
O(n³) Кубичный рост — удвоение размера задачи увеличивает необходимое время в восемь раз Обычное умножение матриц
O(cn) Экспоненциальный рост — увеличение размера задачи на 1 приводит к c-кратному увеличению необходимого времени; удвоение размера задачи увеличивает необходимое время в квадрат Некоторые задачи коммивояжёра, алгоритмы поиска полным перебором

Наличие исходных данных и некоторого результата

Алгоритм — это точно определённая инструкция, последовательно применяя которую к исходным данным, можно получить решение задачи. Для каждого алгоритма есть некоторое множество объектов, допустимых в качестве исходных данных. Например, в алгоритме деления вещественных чисел делимое может быть любым, а делитель не может быть равен нулю.

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

Для разработки алгоритмов и программ используется алгоритмизация — процесс систематического составления алгоритмов для решения поставленных прикладных задач. Алгоритмизация считается обязательным этапом в процессе разработки программ и решении задач на ЭВМ. Именно для прикладных алгоритмов и программ принципиально важны детерминированность, результативность и массовость, а также правильность результатов решения поставленных задач.

Алгоритм — это понятное и точное предписание, исполнительно совершить последовательность действий, направленных на достижение цели.

Представление алгоритмов

Формы записи алгоритма:

  • словесная или вербальная (языковая, формульно-словесная);
  • дракон-схема;
  • псевдокод (формальные алгоритмические языки);
  • схематическая:
    • структурограммы (схемы Насси-Шнайдермана);
    • графическая (блок-схемы).

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

Эффективность алгоритмов

Хотя в определении алгоритма требуется лишь конечность числа шагов, требуемых для достижения результата, на практике выполнение даже хотя бы миллиарда шагов является слишком медленным. Также обычно есть другие ограничения (на размер программы, на допустимые действия). В связи с этим вводят такие понятия как сложность алгоритма (временна́я, по размеру программы, вычислительная и др.).

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

Ярким примером является алгоритм Чудновского для вычисления числа  pi .

Пример

В качестве примера можно привести алгоритм Евклида.

Алгоритм Евклида — эффективный метод вычисления наибольшего общего делителя (НОД). Назван в честь греческого математика Евклида; один из древнейших алгоритмов, который используют до сих пор[21].

Описан в «Началах» Евклида (примерно 300 до н. э.), а именно в книгах VII и X. В седьмой книге описан алгоритм для целых чисел, а в десятой — для длин отрезков.

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

функция нод(a, b)
    если b = 0
       возврат a
    иначе
       возврат нод(b, a mod b)

Иллюстрация выполнения алгоритма Евклида для вычисления НОД чисел 1599 и 650.

НОД чисел 1599 и 650:

Шаг 1 1599 = 650*2 + 299
Шаг 2 650 = 299*2 + 52
Шаг 3 299 = 52*5 + 39
Шаг 4 52 = 39*1 + 13
Шаг 5 39 = 13*3 + 0

См. также

  • Список алгоритмов
  • Адаптивный алгоритм
  • Метаалгоритм
  • Теория алгоритмов

Примечания

  1. Kleene 1943 in Davis 1965:274
  2. Rosser 1939 in Davis 1965:225
  3. (Игошин, с. 317)
  4. Basics: The Turing Machine (with an interpreter!. Good Math, Bad Math (9 февраля 2007). Архивировано из первоисточника 2 февраля 2012.
  5. (Игошин, раздел 33)
  6. Энциклопедия кибернетики, т. 2, c. 90-91.
  7. (Игошин, раздел 34)
  8. 1 2 «Probabilistic algorithms should not be mistaken with methods (which I refuse to call algorithms), which produce a result which has a high probability of being correct. It is essential that an algorithm produces correct results (discounting human or computer errors), even if this happens after a very long time.» Henri Cohen A Course in Computational Algebraic Number Theory. — Springer-Verlag, 1996. — P. 2. — ISBN 3-540-55640-0
  9. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rives’t, Clifford Stein . — ISBN 0-262-03293-7
  10. (Раздел 12, с. 12-22 в Atallah, 2010)
  11. (Игошин, раздел 36)
  12. 1 2 3 Peter Linz An Introduction to Formal Languages and Automata. — Jones and Bartlett Publishers, 2000. — ISBN 0-7637-1422-4
  13. «computability and complexity», Encyclopedia of computer Science and Technology, Facts On File, 2009, ISBN 978-0-8160-6382-6
  14. (O’Regan, раздел 4.5)
  15. (раздел 5.3.6 в Enders, 2003)
  16. (раздел 5.3.7 в Enders, 2003)
  17. (O’Regan, с. 119)
  18. А. Ахо, Дж. Хопкрофт, Дж. Ульман Построение и анализ вычислительных алгоритмов = The Design and Analysis of Computer Algorithms. — «Мир», 1979.
  19. (раздел 11 в Atallah, 2010)
  20. (раздел 1 в Atallah, 2010)
  21. Knuth D The Art of Computer Programming, Volume 2: Seminumerical Algorithms. — 3rd. — Addison–Wesley, 1997. — ISBN 0201896842

Литература

  • Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1
  • Дональд Кнут Искусство программирования, том 1. Основные алгоритмы = The Art of Computer Programming, vol.1. Fundamental Algorithms. — 3-е изд. — М.: «Вильямс», 2006. — С. 720. — ISBN 0-201-89683-4
  • Порублев Илья Николаевич, Ставровский Андрей Борисович. Алгоритмы и программы. Решение олимпиадных задач. — М.: «Вильямс», 2007. — С. 480. — ISBN 978-5-8459-1244-2
  • Игошин В. И. Математическая логика и теория алгоритмов. — 2-е изд., стер.. — М.: ИЦ «Академия», 2008. — 448 с. — ISBN 5-7695-1363-2

Ссылки

wikt: алгоритм в Викисловаре?
b: Что такое алгоритм в Викиучебнике?
  • «Слово „алгоритм“: происхождение и развитие», В. В. Шилов, Журнал «Потенциал» — источник исторических сведений.
  • Алгоритмы, методы, исходники — сайт по алгоритмам и методам программирования
  • Дискретная математика: Алгоритмы — список алгоритмов
  • Юрий Лифшиц. Курс лекций Алгоритмы для Интернета
  • Геометрические алгоритмы
  • об алгоритме в энциклопедии «Кругосвет»
  • Сборник алгоритмов на сайте e-maxx.ru
  • Алгори́тм — набор инструкций, описывающих порядок действий исполнителя для достижения некоторого результата. В старой трактовке вместо слова «порядок» использовалось слово «последовательность», но по мере развития параллельности в работе компьютеров слово «последовательность» стали заменять более общим словом «порядок». Независимые инструкции могут выполняться в произвольном порядке, параллельно, если это позволяют используемые исполнители.

    Ранее в русском языке писали «алгорифм», сейчас такое написание используется редко, но, тем не менее, имеет место исключение (нормальный алгорифм Маркова).

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

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

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

    Частичная формализация понятия алгоритма началась с попыток решения проблемы разрешения (нем. Entscheidungsproblem), которую сформулировал Давид Гильберт в 1928 году. Следующие этапы формализации были необходимы для определения эффективных вычислений или «эффективного метода»; среди таких формализаций — рекурсивные функции Геделя — Эрбрана — Клини 1930, 1934 и 1935 гг., λ-исчисление Алонзо Чёрча 1936 г., «Формулировка 1» Эмиля Поста 1936 года и машина Тьюринга. В методологии алгоритм является базисным понятием и получает качественно новое понятие как оптимальности по мере приближения к прогнозируемому абсолюту. В современном мире алгоритм в формализованном выражении составляет основу образования на примерах, по подобию.

  • ОСНОВЫ АЛГОРИТМИЗАЦИИ

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

    В основу работы ЭВМ положен программный принцип управления, состоящий в том, что ЭВМ выполняет действия по заранее заданной программе.

    Программа – это упорядоченная последовательность команд, которые понимает ЭВМ.

    В основе любой программы лежит алгоритм.

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

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

    Свойства алгоритмов

    1.  дискретный (пошаговый) характер определяемого им процесса.

    2.  записан на понятном ему языке и содержит предписания, которые исполнитель может выполнить.

    3.   его массовость, применимость к некоторому классу объектов, возможность получения результата при различных исходных данных на некоторой области допустимых значений.

    4.  обязательное требование к алгоритмам – требование их конечности.

    5.  эффективность алгоритма. Время выполнения алгоритма и необходимые ресурсы.

    Алгоритмизация – процесс разработки и описания алгоритма решения какой-либо задачи.

    Существует два вида средств для представления алгоритмов – языковые и графические .

    Словесная запись алгоритмов

    Пример Составим алгоритм вычисления коэффициентов приведенного квадратного уравнения x2 + px + q = 0, корни которого x1, x2 известны.

    алгоритм:

    Начало.

    1. Ввести x1, x2.

    2. p = –(x1+x2).

    3. q = x1x2.

    4. Вывести p, q.

    Конец. □

    ГОСТ 19.701-90 Схемы алгоритмов , программ, данных и систем.

    Схемы алгоритмов

    Схема алгоритма – это графический способ его представления с элементами словесной записи.

    Таблица Изображение блоков в схемах алгоритмов

    Наименование символа

    Обозначение
    и размеры

    Функция

    Процесс
    (вычислительный блок)

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

    Решение (логический блок)

    Выбор направления выполнения алгоритма в зависимости от некоторых условий

    Модификация (заголовок цикла)

    Выполнение операций по управлению циклом – повторением команды или группы команд алгоритма

    Пуск-останов (начало-конец)

    Начало или конец выполнения программы или подпрограммы

    Предопределенный процесс (вызов подпрограммы)

    Вызов и использование ранее созданных и отдельно описанных алгоритмов (подпрограмм)

    Ввод-вывод

    Общее обозначение ввода или вывода данных в алгоритме безотносительно к внешнему устройству

    Соединитель

    Указание прерванной связи между блокам в пределах одной страницы

    Межстраничный соединитель

    Указание прерванной связи между блоками, расположенными на разных листах

    Рис. 1 Алгоритм вычисления коэффициентов
    приведенного квадратного уравнения

    Технология разработки алгоритмов

    Какими качествами должен обладать хороший алгоритм?

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

    Но не менее важно, какой ценой это достигается. Речь идет о разумности затрат на его создание.

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

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

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

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

    а) структуры следования или последовательности;

    б) структуры ветвления;

    в) структуры цикла .

    Прямоугольник 1 Ромб 6

    Прямая со стрелкой 2 Прямая со стрелкой 7 Прямая со стрелкой 8

    Прямоугольник 3 Параллелограмм 5 Прямая со стрелкой 9 Прямая со стрелкой 10

    Прямая со стрелкой 4

    Прямоугольник 11 Прямоугольник 12

    Прямая со стрелкой 13 Прямая со стрелкой 14

    Прямая соединительная линия 15 Прямая со стрелкой 16

    Шестиугольник 17 Прямая со стрелкой 19 Прямая со стрелкой 30

    Прямая соединительная линия 25 Прямая со стрелкой 26

    Прямая со стрелкой 21

    Прямоугольник 22

    Прямая со стрелкой 23

    Прямоугольник с двумя вырезанными соседними углами 27 Прямая соединительная линия 29

    Прямая со стрелкой 28

    Прямая соединительная линия 24

    Рис.2. Базисные управляющие структуры

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

    а) структура сокращенного ветвления;

    б) структура выбора; в) структура цикла с параметром;

    г) структура цикла с постусловием (Рис. 0 .1, соответственно а, б, в, г).

    Рис. 0.1. Дополнительные управляющие структуры

    Любой алгоритм может быть построен посредством композиции базисных и дополнительных структур:

    — путем их последовательного соединения образования последовательных конструкций;

     путем их вложения друг в друга образования вложенных конструкций.

    В области автоматизированной обработки данных такой подход называют нисходящим проектированием или проектированием «сверху вниз» .

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

    При восходящей схеме алгоритм начинают разрабатывать с создания алгоритмов для подпрограмм.

    Структуры алгоритмов

    Алгоритмы линейной структуры

    Ветвления

    Схема алгоритма приведена на Рис. 0 .2. Алгоритм содержит сложное ветвление, являющееся композицией двух простых ветвлений.

    Рис. 0.2. Алгоритм решения квадратного уравнения

    К операндам вещественного типа не следует применять операцию отношения «=» (равно), условие может не выполняться из-за неточного представления вещественных чисел в памяти ЭВМ и неизбежных ошибок округления при вычислениях. В алгоритме отношение D = 0 заменено отношением |D| < , где  – допустимая погрешность округления. □

    Циклы

    Вычислительные процессы с многократным повторением однотипных вычислений/действий для различных значений входящих величин/данных называются циклическими, повторяемые участки вычислений – циклами, изменяющиеся в цикле величины – переменными цикла. Для организации циклов в алгоритмах необходимо предусмотреть (Рис. 0 .3):

    — подготовку цикла – задание начальных значений переменным цикла перед первым его выполнением;

    — тело цикла – вычислении/действия, повторяемые в цикле для различных значений переменных цикла;

    — модификацию/изменение значений переменных цикла перед каждым новым его повторением;

    — управление циклом – проверку условия продолжения/окончания цикла и переход на повторение цикла или его окончание.

    Рис. 0.3. Общие схемы циклического алгоритма

    Рис. 0.4. Общие схемы алгоритма табулирования функции

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

    Системы программирования

    Это комплекс средств для разработки программ:

    • Языки программирования

    (ассемблер, Алгоритмические языки;)

    • Инструментальные системы;

    • Системы визуальной разработки программ.

    • Системы создания ПО для работы в Internet

    Алгоритмический язык предназначен для записи алгоритма, удобный для программиста и понятный ЭВМ.

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

    Трансляторы могут быть компилирующего типа – компиляторы и интерпретирующего типа – интерпретаторы.

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

    Интерпретатор (простой интерпретатор) сразу производит анализ, перевод (в машинный код) и выполнение программы строка за строкой. Поэтому интерпретатор должен находиться в оперативной памяти в течение всего времени выполнения программы пользователя. При интерпретации скорость выполнения программы существенно снижается и интерпретируемая программа не может выполняться отдельно от программы-интерпретатора, однако весь процесс прохождения программы на ЭВМ упрощается и имеется возможность организации диалогового (интерактивного ) режима отладки и выполнения программы. Пример, язык Лисп, Бэйсик.

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

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

    Разработать язык – это создать транслятор для него.

    Типы языков программирования

    1. процедурные (императивные, указывают порядок выполнения операторов) (Паскаль ,Си)

    2. логические (декларативные, основаны на мат. Логике) (Лисп, Пролог),

    3. языки запросов (SQL)

    Среди 1. – можно выделить 3 направления

    1. Фортран-ориентированные (Фортран, Кобол, Visual Basic)

    2. Паскаль-ориентированные ( Borland Pascal, TurboPascal, Delphi, Ада, Zonnon)

    3. Си-ориентированные (Си, С++, Java, C#, Borland C++, Turbo C++, Visual C++ )

    История создания языка Паскаль 1970 год.

    Автор – Никлаус Вирт – профессор, директор Института информатики Швейцарской высшей политехнической школы.

    Назван – в честь французского математика Блеза Паскаля, в 1641 г. сконструировал суммирующую машину

    Цель – для обучения программированию

    Турбо – Паскаль

    Автор француз Филип Кан Ученик Вирта Курил Aple 2 и написал компилятор для Паскаля в Калифорнии, имея 2000 дол.. Один из создателей фирмы Borland В 1984 за 1 месяц заработал 150 тыс. дол.

    Среда Delphi 1995 , язык Object Pascal

    История создания языка Си 1972 г.

    Автор Деннис Ритчи программист лаборатории американской корпорации AT&T (Американ телефон и телеграф) как язык системного программирования.

    Цель язык системного программирования

    Преимущества: язык высокого уровня; имеет низкоуровневые средства.

    Кен Томсон — создатель системы UNIX в AT&T использовал С (90% ядра системы написано на С)

    В 1983г. в Американском национальном институте стандартов ( ANSI) ,был утвержден стандарт языка С, ANSI C.

    B начале 80 в той же лаборатории Бьерном Страуструпом создан новый язык С с классами , в 1983 назван С++, как расширение С. Существует много трансляторов С++, будем ориентироваться на трансляторы, созданные фирмой Борланд.

    Перечень алгоритмических языков программирования

    Алгол 1958 Швейцария международный коллектив для записи алгоритмов

    Алгол 60 1960 Питер Наур и др. Международный.

    Фортран 1957(54) США Джон Бэкус (группа IBM)

    Лисп 1958 обработка списков для экспертных систем Джон Маккарти, США

    Кобол 1960 США обработка эконом. Информации несколько авторов

    международный

    Бейсик 1963 США Курт и Джон Кемени и др для начинающих

    ПЛ1 1964 США (группа IBM) универсальный язык Джордж Радин

    Паскаль 1970 Швейцария Никлаус Вирт для обучения

    В честь французского математика Блез Паскаль 1623-1662 (суммирующая машина)

    Пролог 1973 Марсель Европа язык логического программирования

    Алан Кольмеро

    Си 1972 США Деннис Ритчи для профессионалов

    Ада 1980 США (Пентагон) сложный и надежный Джин Имбиа и др.

    С++ 1984 США Бьерн Страуструп объектно-ориентир. расширение С

    Турбо — Паскаль 1984 США Филипп Кан (Борланд) Паскаль для ПК

    Андерс Хельсберг- руковод проекта Delphi

    Версия 7.0 — Borland Pascal

    Borland Pascal 7.0 1992 -.- для MS DOS и Windows

    Java 1995 для разработки сетевых мультимедийных программ, США

    Джеймс Гослинг

    Borland C++ Builder

    Среда Delphi 1995 , язык Object Pascal

    Delphi 5-6 1999 – 2001 Пример RAD – системы среды быстрой визуальной разработки

    Среда Delphi Delphi 7 2002 , язык Delphi

    Turbo-Delphi 2007

    Delphi 8 2008 для платформы Microsoft .Net

    Delphi/ Rad Studio 2010 2009

    Embarcadero RAD Studio основана в1993г, для разработки БД

    а купила Borland в 2008

    Delphi , С++ Builder

    2014 год Embarcadero® RAD Studio XE7

    создание приложений для

    Windows 8, Mac, .NET, Web и мобильных платформ.

    Содержит: Delphi®, C++Builder®, Embarcadero Prism™ и HTML5 Builder.

    С RAD Studio XE3 сущствует встроенная поддержка для SQL Server, Oracle, Sybase, DB2, InterBase, SQL Anywhere, SQLite, MySQL и облачными сервисами, включая Windows Azure и Amazon.

    Инструментальные системы — это комплекс средств для разработки программ:

    • Текстовый редактор;

    • Транслятор;

    • Отладчик;

    • Средства выполнения программ

    • Интерфейс среды.

    Системы визуальной разработки программ включают:

    • Инструментальную систему

    • Возможность визуального редактирования интерфейса программы

    • Автоматическое написание кода программы при использовании визуального интерфейса системы.

    Системы создания ПО для работы в Internet

    Технология .Net

    .Netэто стратегия создания крупных распределенных систем, разработанная компанией Microsoft. Ключевым элементом .Net является платформа .Net Framework, т.е. компонентная модель программного обеспечения для работы в сети. Она позволяет совместно использовать отдельные программные компоненты, созданные на разных языках программирования.

    Компонент – это некий функциональный элемент, содержащий определенные свойства и размещаемый программистом внутри формы.

    С# — основан на синтаксисе С ( с упрощением его) предназначен для технологии .Net.

    Отладка и тестирование программы

    Отладка программы является итеративным процессом обнаружения и исправления ошибок и обычно требует последовательного выполнения четырех этапов:

    • выявления ошибки;

    • локализации ошибки в тексте программы;

    • установления причины ошибки;

    • исправления ошибки.

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

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

    ТЕСТ – это совокупность входных и выходных данных, полученных до выполнения программы.

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

    Нормальные случаи – это примеры с правильными входными данными. Если программа не работает в подобных случаях, она требует серьезных переделок. Граничные контрольные примеры помогают установить, способна ли программа нормально реагировать на особые случаи во входных данных.

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

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

    Причины и типы ошибок

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

    • синтаксические ошибки;

    • семантические ошибки;

    • логические ошибки.

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

    Семантические ошибкиэто ошибки, проявляющиеся на этапе выполнения программы при ее попытке вычислить недопустимые значения параметров или выполнить недопустимые действия. Причина возникновения ошибок данного типа связана с нарушением семантических правил написания программ (примером являются ситуации попытки открыть несуществующий файл или выполнить деление на нуль). Если программа обнаруживает ошибку такого типа, то она завершает свое выполнение и выводит соответствующее сообщение в окне Build, содержащее номер строки с ошибкой и ее возможный характер. Список сообщений можно просмотреть с помощью команды меню View/Debug Windows/Event Log.

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

    Для обнаружения и устранения ошибок второго и третьего типа обычно применяют специальные способы и средства отладки программ.

    Выявлению ошибок второго типа часто помогает использование контролирующих режимов компиляции с проверкой допустимых значений тех или иных параметров (границ индексов элементов массивов, значений переменных типа диапазона, ситуаций переполнения, ошибок ввода-вывода). Устанавливаются эти режимы с помощью ключей компилятора, задаваемых либо в программе, либо в меню Project/Options/Compiler среды Delphi, либо в меню Options/Compiler Турбо-среды.

        1. Способы и средства отладки

    В ходе отладки программа должна быть проверена в двух измерениях: в пространстве и во времени.

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

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

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

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

    Процесс отладки значительно облегчается, если использовать для этого системные средства отладки – специальные программы-отладчики, имеющиеся в программном обеспечении компьютера.

    Встроенный отладчик среды Delphi или Турбо Паскаля (Debugger) позволяет контролировать ход выполнения программы – выполнять трассировку программы без изменения самой программы с помощью следующих действий:

    • выполнения программы построчно/по шагам;

    • остановки выполнения программы в заданной точке останова;

    • перезапуска программы, не закончив ее выполнение;

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

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

    Отладка программ в среде Delphi

    (для программирующих в Delphi)

    В Delphi имеется мощный встроенный отладчик, значительно упрощающий отладку программ. Основными инструментами отладки являются точки контрольного останова и окно наблюдения за переменными.

          1. Точки контрольного останова

    Точка контрольного останова определяет оператор в программе, перед выполнением которого программа прервет свою работу, и управление будет передано среде Delphi. Точка останова задается с помощью опции View|Debug windows|Breakponts.

    Окно точек останова содержит список всех установленных в проекте точек, перед выполнением которых происходит прекращение работы программы и управление получает среда Delphi.

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

    FileName – определяет имя файла;

    Line number – номер строки от начала файла (в момент появления окна оно содержит файл и строку с текстовым курсором);

    Condition – можно указать условие останова в виде логического выражения (например, MyValue = МахValue-12);

    Pass count – количество проходов программы через контрольную точку без прерывания вычислений.

    Окно точек останова (слева) и окно добавления новой точки (справа)

          1. Окно наблюдения

    Наблюдать за состоянием переменной или выражения можно с помощью специального окна, вызываемого опцией View|Debug windows|Watches.

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

    Для добавления нового выражения следует щелкнуть по окну правой кнопкой мыши и выбрать опцию New Watch. В строке Expression ввести выражение. Окно Repeat count определяет количество показываемых элементов массивов данных; окно Digits указывает количество значащих цифр для отображения вещественных данных; переключатель Enabled разрешает или запрещает вычисление выражения. Остальные элементы определяют вид представления значения.

    Значения переменных можно также посмотреть во время останова программы, наведя курсор мыши на переменную в тексте кода.

    Окно наблюдения и окно добавления в него нового выражения

          1. Принудительное прерывание работы программы

    Если программа запущена из среды Delphi, ее работу можно прервать в любой момент с помощью клавиш Ctrl+F2, кнопки ESC, опцией Run|Program Pause или, наконец, установив точку контрольного останова в той части программы, которая выполняется в данный момент или будет выполнена.

          1. Трассировка программы

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

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

    Следует заметить, что контрольная точка останова выделяется по умолчанию красным цветом, а текущая прослеживаемая строка – синим. Если программа остановлена в контрольной точке, т. е. когда текущая строка совпадает со строкой останова, строка выделяется красным цветом.

    21

    Понравилась статья? Поделить с друзьями:
  • Точное описание некоторого процесса инструкция по его выполнению
  • Точное описание некоторого процесса инструкция по его выполнению
  • Точная инструкция определяющая процесс достижения поставленной цели за конечное число шагов
  • Точка доступа tp link cpe210 инструкция
  • Точка доступа tp link cpe210 инструкция