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

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

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

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

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

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

  • Этап 1 . Математическое описание решения задачи.
  • Этап 2 . Определение входных и выходных данных.
  • Этап 3 . Разработка алгоритма решения задачи.

Базовые алгоритмические конструкции

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

  • следование (линейный алгоритм);
  • ветвление (разветвляющийся алгоритм);
  • цикл-пока (циклический алгоритм).

Линейные алгоритмы

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

Пример

ЗАДАЧА. Разработать алгоритм вычисления гипотенузы прямоугольного треугольника по известным значениям длин его катетов a и b.

На примере данной задачи рассмотрим все три этапа разработки алгоритма решения задачи:

Этап 1. Математическое описание решения задачи.

Математическим решением задачи является известная формула:

,

где с-длина гипотенузы, a, b – длины катетов.

Этап 2. Определение входных и выходных данных.

Входными данными являются значения катетов a и b. Выходными данными является длина гипотенузы – c.

Этап 3. Разработка алгоритма решения задачи.

Словесное описание алгоритма Запись алгоритма на языке блок-схем
  1. Начало алгоритма.
  2. Ввод значений длин катетов a и b.
  3. Вычисление длины гипотенузы с по формуле
  4. Вывод значения длины гипотенузы.
  5. Конец алгоритма

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

Разветвляющиеся алгоритмы

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

Пример

ЗАДАЧА. Разработать алгоритм вычисления наибольшего числа из двух чисел x и y.

Этап 1. Математическое описание решения задачи.

Из курса математики известно, если x > y, то наибольшее число x, если x y, то переход к шагу 6, иначе к шагу 7.

  • Вывод информации: число x больше y. Переход к шагу 8.
  • Вывод информации: число y больше x. Переход к шагу 8.
  • Конец алгоритма.
  • В схеме алгоритма решения задачи цифрами указаны номера элементов алгоритма, которые соответствуют номерам шагов словесного описания алгоритма

    В рассматриваемом алгоритме (рис.3) имеются три ветви решения задачи:

    • первая: это элементы 1, 2, 3, 4, 8.
    • вторая: это элементы 1, 2, 3, 5, 6, 8
    • третья: это элементы 1, 2, 3, 5, 7, 8.

    Выбор ветви определяется значениями x и y в элементах 3 и 5, которые являются условиями, определяющими порядок выполнения элементов алгоритма. Если условие (равенство), записанное внутри символа «решение», выполняется при введенных значениях x и y, то следующими выполняется элементы 4 и 8. Это следует из того, что они соединены линией с надписью «да» и направление (последовательность) вычислений обозначена стрелочкой.

    Если условие в элементе 3 не выполняется, то следующим выполняется элемент 5. Он соединен с элементом 3 линией с надписью «нет». Если условие, записанное в элементе 5, выполняется, то выполняется элементы 6 и 8, в противном случае выполняются элементы 7 и 8.

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

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

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

    При разработке алгоритма циклической структуры выделяют следующие понятия:

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

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

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

    • начальные значения цикла;
    • конечные значения цикла;
    • шаг цикла.

    В тело цикла входят:

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

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

    Пример

    ЗАДАЧА. Разработать алгоритм вычисления суммы натуральных чисел от 1 до 100.

    Читайте также:  Струйный принтер характеристики кратко

    Этап 1. Математическое описание решения задачи.

    Обозначим сумму натуральных чисел через S. Тогда формула вычисления суммы натуральных чисел от 1 до 100 может быть записана так:

    где Xi – натуральное число X c номером i, который изменяется от 1 до n, n=100 – количество натуральных чисел.

    Этап 2. Определение входных и выходных данных.

    Входными данными являются натуральные числа: 1, 2, 3, 4, 5, …, 98, 99, 100.

    Выходные данные – значение суммы членов последовательности натуральных чисел.

    Параметр цикла величина, определяющая количество повторений цикла. В нашем случае i – номер натурального числа.

    Подготовка цикла заключается в задании начального и конечного значений параметра цикла.

    • начальное значение параметра цикла равно 1,
    • конечное значение параметра цикла равно n,
    • шаг цикла равен 1.

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

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

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

    Этап 3. Разработка алгоритма решения задачи.

    Введем обозначения: S – сумма последовательности, i – значение натурального числа.

    Начальное значение цикла i=1, конечное значение цикла i =100, шаг цикла 1.

    Этим постом начинается разбор задачек по алгоритмам, которые крупные IT-компании (Mail.Ru Group, Google и т.п.) так любят давать кандидатам на собеседованиях (если плохо пройти собеседование по алгоритмам, то шансы устроиться на работу в компанию мечты, увы, стремятся к нулю). В первую очередь этот пост полезен для тех, кто не имеет опыта олимпиадного программирования или тяжеловесных курсов по типу ШАДа или ЛКШ, в которых тематика алгоритмов разобрана достаточно серьезно, или же для тех, кто хочет освежить свои знания в какой-то определенной области.

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

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

    1. Начнем с баян-баяныча: нужно сгенерировать все правильные скобочные последовательности со скобками одного вида (что такое правильная скобочная последовательность), где количество скобок равно k.

    Эту задачу можно решить несколькими способами. Начнем с рекурсивного.

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

    Сложность этого алгоритма — , дополнительной памяти требуется .

    При заданных параметрах вызов функции выведет следующее:

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

    Все правильные скобочные последовательности для одного типа скобок можно упорядочить с учётом того, что . Например, для n=6 самой лексикографически младшей последовательностью будет , а самой старшей — .

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

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

    Сложность этого алгоритма такая же, как и в прошлом примере.

    Кстати, есть несложный способ, который демонстрирует, что количество сгенерированных скобочных последовательностей для данного n/2 должно совпадать с числами Каталана.

    Отлично, со скобками пока всё, теперь перейдем к генерированию подмножеств. Начнем с простой задачки.

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

    Заметим, что количество подмножеств такого множества равно в точности . Если каждое подмножество представить в виде массива индексов, где означает, что элемент не входит в множество, а — что входит, тогда генерирование всех таких массивов будет являться генерированием всех подмножеств.

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

    Сложность этого алгоритма — , по памяти — .

    Теперь чуть-чуть усложним предыдущую задачу.

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

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

    Читайте также:  Научитесь узнавать планеты по фотографиям

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

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

    Осталось понять, как описать переход от одной последовательности к другой. Тут всё просто: если меняем на , то слева пишем лексикографически минимальное с учетом сохранения условия на . Код:

    Сложность этого алгоритма — , по памяти — .

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

    Теперь попробуем рекурсию. Идея простая: на этот раз обойдемся без описания, смотрите код.

    Пример работы:

    Сложность такая же, как и у прошлого способа.

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

    Будем решать с помощью рекурсии. Решение похожа на предыдущее, где у нас есть вспомогательный список. Изначально он нулевой, если на -ом месте элемента стоит единица, то элемент уже есть в перестановке. Сказано — сделано:

    Сложность этого алгоритма — , по памяти —

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

    6. Сгенерировать все двумерные коды Грея длиной n.

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

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

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

    Это сложно воспринять «на слух», изобразим итерации этого алгоритма.

    Сложность этой задачи — , по памяти такая же.

    Теперь усложним задачу.

    7. Сгенерировать все k-мерные коды Грея длиной n.

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

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

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

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

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

    Сложность алгоритма — , по памяти — .

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

    В следующем посте будем разбирать задачки на динамику.

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

    Составить алгоритм – значит выбрать единственный из всех возможных вариантов решения.

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

    Основные свойства алгоритма:

    Определённость означает однозначность выполнения запланированной последовательности элементарных действий.

    Определённость исключает нарушения заданного порядка вычислений и произвольность толкования предписаний.

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

    Массовость достигается реализацией в алгоритме конкретной задачи её универсального математического описания.

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

    Результатом могут быть выходные данные или сообщение о невозможности решения задачи.

    Читайте также:  Цвет проводов usb кабеля

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

    Дискретность определяет обязательную детализацию алгоритма.

    Основные качества алгоритма:

    Наглядность – обеспечение простоты, доступности восприятия алгоритма в целом.

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

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

    Существуют различные способы представления алгоритмов, чаще используют два из них:

    · графическое изображение (схема алгоритма).

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

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

    1) Начать решение.

    3) Вывести исходные данные ПД, ПШ, УБ, ПО, k1, k2, k3, k4.

    4) Вычислить площадь поля .

    5) Вычислить массу выращенного картофеля .

    6) Вычислить массу потерь картофеля .

    7) Вычислить товарную массу картофеля МТ = МВ – МП.

    8) Вывести на печать результаты ПП, МВ, МП, МТ.

    9) Закончить решение.

    Вывод исходных данных выполняется для контроля правильности их ввода.

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

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

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

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

    Обозначения, наименования и правила использования блоков определяются ГОСТом (табл. 1.3).

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

    Продолжение табл. 1.3

    Наименование Обозначение Пояснение
    Документ Вывод указанной в блоке информации на бумажный носитель. Имеет один вход и один выход
    Дисплей Вывод указанной в блоке информации на экран дисплея. Имеет один вход и один выход
    Ввод, вывод Общий вид операции ввода/вывода информации. Имеет один вход и один выход
    Модификация Начало цикла с параметрами, записанными внутри блока. Имеет два входа и два выхода
    Предопре-делённый процесс Переход к подпрограмме с возвратом из неё. Имеет один вход и один выход
    Начало цикла Общее обозначение начала цикла. Имеет один вход и один выход
    Конец цикла Общее обозначение окончания цикла. Имеет один вход и один выход

    Окончание табл. 1.3

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

    В качестве вертикального размера блоков рекомендуется использовать значения ряда 10, 15, 20 мм с допускаемым увеличением на число, кратное 5.

    Горизонтальный размер b рекомендуется выбирать в полтора раза большим, чем a (). При выполнении схем вручную допускается соотношение . В одной схеме возможно использование блоков не более чем с двумя размерами а.

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

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

    Примеры пересечения линий
    не соединяющиеся соединяющиеся слева соединяющиеся справа

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

    Соединение правильное неправильное
    с передачей управления вниз:
    с передачей управления вверх:

    Минимальное расстояние между параллельными линиями связи 3 мм, между блоками – 5 мм. При разрыве линии связи на концах разрыва размещаются соединители. Оба соединителя имеют одинаковую маркировку, например, номер блока, которому передаётся управление. Если соединители расположены на разных страницах, каждый дополняется комментарием. Например:

    С учётом изложенного выполним простейшую схему алгоритма задачи о картофеле (пример 1.3) при выбранной в модели степени детализации (рис. 1.4).

    Рис. 1.4. Простейшая схема алгоритма задачи о картофеле

    Рекомендации по эффективным методам составления алгоритмов приведены в разделе 2.3.

    | следующая лекция ==>
    Выбор метода решения. Алгоритмизация задачи | Программирование задачи

    Дата добавления: 2014-01-07 ; Просмотров: 588 ; Нарушение авторских прав?

    Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

    Ссылка на основную публикацию
    Сообщение на тему жесткий диск по информатике
    Информатика Основным устройством хранения информации в компьютерной системе является жесткий диск. Большой объем и энергонезависимость сделали его наиболее пригодным для...
    Слова содержащие приставку корень суффикс и окончание
    Примеры разборов слов, у которых есть все основные морфемы: приставка, корень, суффикс, окончание. у бор к а у дивл ени...
    Словарь для it специалистов
    ykaneva 2018-04-09T16:54:33+00:00 September 13th, 2017 | Практика английского | 7 Comments 7 142,973 Сегодня день программиста. По этому поводу в...
    Сообщение о выигрыше айфона
    Да, почти всегда это обман и развод на деньги. Те, кто проводит ВКонтакте, Инстаграме и других соцсетях «конкурсы», «розыгрыши айфонов»,...
    Adblock detector