Алгоритмы. Brainware третий «кит» информатики Состав информатики. Информатику обычно представляют состоящей из трёх, неразрывно связанных частей (трех «китов»): ИНФОРМАТИКА Hardware, Software, Brainware Алгоритмы нужны всем: военным, поварам, врачам, фармацевтам, математикам и, конечно, программистам. Мы живём в мире алгоритмов, современная цивилизация – это цивилизация алгоритмов. Мясников Александр Леонидович • Мясников Александр Леонидович: Невозможно противопоставить свой скудный опыт индустрии доказательной медицины. В мире уже выработан алгоритм лечения больных, который выверен на миллионах пациентов. Нам нужно только согласиться с правильностью предложенных методов. Введение системы стандартов позволит нам сэкономить. Если бы мы приняли систему стандартов, все бы узнали, что лучшее лекарство от гипертонии - это копеечные мочегонные препараты, от инфарктов эффективнее всего защищает аспирин, оптимальный антибиотик при пневмонии - тетрациклин стоимостью 15 рублей, а не импортные препараты по 80 долларов за пузырёк. Система стандартов спасёт пациентов и от болезненных операций. Мухаммад ибн Муса Хорезми (783 — 850) — таджикскоперсидский математик, астроном и географ Аль-Хорезми Алгоритм Евклида для отыскания наибольшего общего делителя двух целых положительных чисел a и b: • Рассмотри данные числа a и b, переходим к следующему пункту; • Сравни предложенные числа: a = b; a > b; a < b; переходим к следующему пункту; • Если a = b, то прекратите вычисления, так как каждое из них даст искомый результат. Если нет, переходите к следующему пункту; • Если первое число меньше второго, переставь их местами. Переходите к следующему указанию. • Вычитай второе число из первого. Рассмотри два числа вычитаемое и остаток. Переходите к пункту второму. Потребность в алгоритмизации научных вычислений: Системы мира по Птолемею ( 15 вычислений) и Копернику (7вычислений) Потребность в упрощении системы учета: Механические счетные машины («Паскалина», калькулятор Лейбница, арифмометр) – для их работы необходима инструкция! Дональд Эрвин Кнут (родился в 1938) — американский учёный. Алгоритм — это конечный набор правил, который определяет последовательность операций для решения конкретного множества задач и обладает пятью важными чертами: конечность, определённость, ввод, вывод, эффективность. Андрей Андреевич Марков (1903 — 1979) — советский математик Алгоритм — это точное предписание, определяющее вычислительный процесс, идущий от варьируемых исходных данных к искомому результату. Андрей Николаевич Колмогоров (1903 — 1987) — советский математик Алгоритм — это всякая система вычислений, выполняемых по строго определённым правилам, которая после какого-либо числа шагов заведомо приводит к решению поставленной задачи. Алгоритмы. Определение Алгоритм – это строго определенная последовательность действий для некоторого исполнителя, приводящая к конкретному результату за конечное число шагов. • • Составление алгоритма - творческий процесс. • Выполнения программы - это не творческий процесс. • Ранее часто писали «алгорифм». • Ранее вместо слова «порядок» использовали слово «последовательность». Исполнители: неформальные и формальные Иллюстрация понятия алгоритма Задача Алгоритм Входные данные Вычислитель Выходные данные Проблема разрешимости алгоритма по Гилберту: Всегда можно составить алгоритм, который сможет дать однозначный ответ на любой заданный вопрос ( неразрешимых задач не существует). Алгоритмическая разрешимость — свойство формальной теории обладать алгоритмом, определяющим по данной формуле, выводима она из множества аксиом данной теории или нет. Теория называется разрешимой, если такой алгоритм существует, и неразрешимой, в противном случае. • В 1900 году на Втором Международном математическом конгрессе Гильберт формулирует знаменитый список 23 нерешённых проблем математики Дави́д Ги́ льберт (нем. David Hilbert; 23 января 1862 — 14 февраля 1943) Процедурный текст • …Отвори потихоньку калитку • И войди в тихий садик как тень. • Не забудь потемнее накидку, • Кружева на головку надень… Декларативный текст • Фонтану Бахчисарайского дворца • …Фонтан любви, фонтан живой! • Принес я в дар тебе две розы. • Люблю немолчный говор твой • И поэтические слезы… Тьюринг: нельзя определить алгоритмически, завершит ли данная машина Тьюринга свою работу или нет. А́лан Мэ́тисон Тью́ ринг (англ. Alan Mathison Turing; 23 июня 1912 — 7 июня 1954) — английский математик, логик, криптограф, оказавший существенное влияние на развитие информатики (машина Тьюринга). Алонзо Чёрч (англ. Alonzo Church; 14 июня 1903, Вашингтон, США — 11 августа 1995, Хадсон, Огайо, США) — выдающийся американский математик и логик, внесший значительный вклад в основы информатики (лямбда –исчисление). Самый важный алгоритм информатики • Некоторый алгоритм для нахождения значений функции, заданной в некотором алфавите, существует тогда и только тогда, когда функция исчисляется по Тьюрингу, то есть когда ее можно вычислить на машине Тьюринга. Машина Тьюринга Требования к алгоритму • Дискретность (прерывность, раздельность) – алгоритм состоит из отдельных простых "шагов". Каждый шаг исполняется только после того, как закончилось исполнение предыдущего. • Детерминированность (определенность) – каждая команда алгоритма должна быть однозначной. Алгоритм должен быть независимым от того, кто и сколько раз будет его повторять. (Всётаки, кулинарные рецепты плохо отвечают этому требованию) • Результативность (конечность) – алгоритм должен приводить к результату за конечное число шагов. • Массовость – алгоритм может использоваться многократно при разных исходных данных. Форма представления алгоритмов • Алгоритм может быть записан словами и/или формализован изображён схематически. • Обычно сначала алгоритм описывается словами, затем всё более формализуется (записывается на языке, понятном исполнителю). Если алгоритм выполняется компьютером, то для записи используется машинный код. В алгоритме присутствуют следующие структуры: • линейная часть – команды, выполняемые последовательно друг за другом; • ветвление – участок алгоритма, содержащий условие, в результате проверки которого происходит переход на одно или на другое продолжение алгоритма; • цикл – участок алгоритма, предусматривающий повторение одних и тех же операций с новыми исходными данными. Формы записи алгоритмов •Словесная, на естественном языке; •Графическая, например, в виде блок-схем; •На алгоритмическом языке (псевдокоде); •На языках программирования. Запись алгоритма на естественном языке • Пример: Автомат получает на вход два трехзначных восьмеричных числа. По этим числам строится новое восьмеричное число по следующим правилам: • Вычисляются три восьмеричных числа – сумма старших разрядов, сумма средних разрядов, сумма младших разрядов заданных чисел. • Полученные три восьмеричных числа записываются друг за другом в порядке убывания (без разделителей). • Пример. Исходные числа: 271,626. Поразрядные суммы: 10,11,7. Результат: 11107. • Определите, какое из предложенных чисел может быть результатом работы автомата: 18123; 16711; 13115? Запись алгоритма в виде блок-схем • Для графического представления алгоритмов в виде блок-схемы используются стандартные обозначения элементов (ГОСТ 19.701 – 90). начало и конец алгоритма Блок выполнения операции, обработки данных, изменения значения Логический блок (проверка истинности или ложности логического выражения (условия) и выбор следующего блок; ветвление алгоритма с одним входом и несколькими (двумя) выходами, из которых может быть выбран только один Блок ввода/ вывода данных Запись алгоритма на алгоритмическом языке (псевдокоде) Программа - это алгоритм, записанный на языке программирования. • Оператор присвоения -(:=). • Примеры: • 1. Х:=2+5 • 2. Х:= Х*2 • 3. Х:=2>5 Задача: Установите такой порядок выполнения операций, чтобы при начальных значениях А=2, В=5, С=-5 результирующим стало значение С=5. • 1) С=С/5; 2) В=А+В; 3) С=В+10; 4) А=А*В. Оператор перехода • Команды в программах выполняются последовательно. Имеется несколько операторов, которые изменяют последовательность выполнения команд программы. • Формат записи оператора: GO TO <метка строки>. Оператор ветвления • Форматы записи оператора: • IF(ЕСЛИ) <логическое условие> THEN (ТО)<оператор 1> ELSE (ИНАЧЕ)<оператор 2> • Если логическое условие истинно, то выполняется первый блок операторов, а если ложно, то второй. • Пример: • IF А>В THEN А=А*2 ELSE В=В*2 Блок-схема оператора ветвления: Заданы числа a и b. Определить, эти числа одного или разных знаков? • При начальных значениях А=-1, В=3.Чему будет равно С? • IF А>=В THEN С:=(А – В)*В ELSE С:= (В-А)*А • IF С<0 THEN С:=С*С Дана болок-схема. Какое значение присваивается переменной Х после исполнения алгоритма? (5) a:= 5 b:= 3 с:= 1 Х:= a ДА Х:= b Х< = b нет 256 Х< = с нет ДА Х:= с Операторы цикла. • Операторы цикла организуют повторное выполнение одних и тех же команд несколько раз. • Существуют две разновидности операторов цикла: оператор цикла с фиксированным числом повторений и операторы цикла с переменным числом повторений, зависящим от условий. • Формат записи оператора цикла с фиксированным числом повторений: FOR i=N1 TO N2 STEP N3; • <тело цикла> ; • NEXT i Цикл с переменным числом повторений: Блок-схема цикла ПОКА (цикл с предусловием) • Цикл с предусловием Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A Цикл с переменным числом повторений: Формат записи цикла ПОКА НЕ Задача, в которой требуется вводить с клавиатуры числа и подсчитывать их сумму, до первого введенного отрицательного числа. Как вы думаете, к какому виду алгоритмов относится следующий пример? Что он позволит вычислить? Запись алгоритма на языке программирования • #!/usr/bin/python3 • # -*-coding: utf-8 -*• import math • A = float(input( 'a: ')) • B = float(input( 'b: ')) • C = float(input( 'c: ')) • D = B*B - 4.0*A*C • X1 = (-B + math.sqrt(D))/(2.0*A) • X2 = (-B - math.sqrt(D))/(2.0*A) • print (X1,X2) • print ('END') Классификация алгоритмов • детерминированные (жесткие): задаются действия, обеспечивающие однозначный результат (например, работа двигателя); • гибкие: • вероятностные (стохастические): используют способы, приводящие к вероятному достижению результата (например, метод Монте-Карло) • эвристические: достижение результата однозначно не предопределено Эвристический алгоритм (эвристика) Эвристика (от греч. εὕρηκα «нашёл!») - алгоритм решения задачи, не имеющий строгого обоснования, но, тем не менее, дающий приемлемое решение задачи в большинстве случаев. Эвристика — это математически «не совсем корректный», но практически полезный алгоритм. Эвристика. Особенности: • она не гарантирует нахождение лучшего решения; • она не гарантирует нахождение решения, даже если оно заведомо существует; • она может дать неверное решение. Эвристики применяются для решения задач, когда полный перебор вариантов занимает существенное время. Например, при распознавании образов, в антивирусных программах, компьютерных играх и т. д. Пример эвристического алгоритма. Задача коммивояжера. Коммивояжёр должен посетить один раз все указанные города и вернуться обратно, в начальную точку маршрута. Необходимо выбрать минимальный по затратам маршрут. • Коммивояжёр — разъездной торговый агент. Детерминированный алгоритм В общем случае, если есть n городов, то существует (n-1)! вариантов маршрута. Время, требуемое для детерминированного алгоритма Посчитать длину маршрута можно за 1 нс = 10-9 с. Число городов Время расчета 10 меньше секунды 15 87 секунд 18 99 часов 19 74 дня 20 3 с половиной года 22 полторы тысячи лет Оптимальный маршрут: 1-5-2-3-4-1. 1 1 2 3 4 5 10 25 25 10 10 15 2 20 10 2 1 3 8 9 4 14 10 24 5 10 8 25 15 27 «Посмотрел – и сразу понял!» • ДРАКОН (Дружелюбный Русский Алгоритмический язык, Который Обеспечивает Наглядность). Тест Тьюринга — эмпирический тест, идея которого была предложена Аланом Тьюрингом в статье «Вычислительные машины и разум», опубликованной в 1950 году в философском журнале «Mind». Тьюринг задался целью определить, может ли машина мыслить.