Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Конструирование алгоритмов

Лекция



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

" Узнавать о новых алгоритмах и учиться их применять - важная часть программистского образования. "
Говард Джонстон

" Надо сочинить закон или таблицу, по которой числа росли бы необъяснимыми непериодическими интервалами. "
Даниил Хармс

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

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

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

"Что ж это за алгоритмы такие, где подобного быстродействия может быть недостаточно?" - спросит читатель. "Да много таких алгоритмов!" - ответим мы скептику. И упомянем, для начала, приводившийся ранее пример отбора треугольников, исходное "сырье" для которых извлекается из набора отрезков. В самом деле, эффективность напрашивающегося, "лобового", решения оценивается как O(n3), и, стало быть, набор из тысячи отрезков (103) будет обрабатываться более четверти часа. Так долго ожидать результат, сидя у экрана компьютера, - занятие мало увлекательное.

Не станем утверждать, что предлагаемый вариант, требующий O(n3) шагов, - единственно возможный. Напротив, читателю стоит поразмышлять над тем, как распорядиться ресурсами более экономно, и, тем самым, ступить на путь конструирования эффективных алгоритмов. Но ведь это и требовалось доказать: уже имеющийся в нашем распоряжении алгоритм провоцирует нас на поиски более качественного механизма. Тем более, стоит поискать лучшее решение, если временнАя сложность готового алгоритма оценивается как O(n4) или O(n5). И не говорите, что таких задач не бывает, - ошибетесь.

Однако вас, возможно, удивит, что вычислительные процессы с трудоемкостью O(n3)O(n4) и даже O(n5) отнюдь не обязательно являются продуктами плохой алгоритмизации. Напротив, такие задачи не единичны, хотя здесь пока рано переходить к их постановке. Скажем лишь, что нередко более эффективных алгоритмов либо не сконструировать в принципе, либо просто до сих пор не придумали. Отметим их общее свойство: все они относятся к классу так называемых алгоритмов с полиномиальной временнОй сложностью - O(nk), где k - константа, и, естественно, не меняется с ростом количества элементов n.

Как же решаются, если в том возникает необходимость, задачи класса O(n4) или O(n5) для "больших" n? Ну, во-первых, не стоит забывать, что мы рассматриваем процессы, в основе которых лежит последовательное выполнение инструкций, а существует ведь и такая альтернатива, как параллельные вычисления. Кроме того, злополучные "четверть часа ожидания" критичны для пользователя, работающего непосредственно за компьютером, но совершенно безразличны ему, если вычислительный процесс идет в фоновом режиме работы его "персоналки" или, тем более, в пакетном режиме большой вычислительной машины.

Гораздо хуже обстоит дело с алгоритмами, трудоемкость которых составляет O(2n)O(n!)O(nn) и более. В этом перечне каждая очередная функция "перекрывает", при достаточно больших n, предыдущие функции того же ряда. Или, как говорят,мажорирует их. Притом, любая из них мажорирует трудоемкость полиномиальную. Такие алгоритмы принято характеризовать как имеющие экспоненциальную сложность.

Обратимся к примеру.

Пример 1

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

Несколько изменив условие, будем рассматривать всевозможные способы рассадки всех n учеников на n местах. Об этом говорит сайт https://intellect.icu . Легко заметить, что таких способов существует ровно

n·(n-1)·(n-2)·...·2·1 = n!  
Уже в маленьком классе, с десятью учениками, количество вариантов превосходит 3.5 миллиона. Предположим, наш компьютер столь хорош, что справится с такой порцией за одну секунду. Но стоит посадить в класс еще 5 учеников, и времени потребуется уже в 11·12·13·14·15=360360 раз больше, или более 4 суток непрерывного счета.

 

Как видим, применять алгоритмы с вычислительной трудоемкостью O(n!) надо очень осторожно, если хотим дождаться конечного результата. Что же делать?

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

Предположим, что в классе из 15 человек, формируя очередное размещение их по партам, мы зафиксировали выбор 5 определенных учеников на места с 1-го по 5-е. Стало быть, на остающиеся 10 мест претендуют остальные 10 учеников, что соответствует 10! возможностям выбора. Если используемый в задаче критерий отбора позволяет зафиксировать нерентабельность уже исходного отбора "первой пятерки", то и все семейство из 10! соответствующих ему рассадок нет смысла перебирать.

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

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

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

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

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

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

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

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

Упражнение 1

Классический способ приближенного вычисления числа π, вероятно, известен вам из школьного курса геометрии, но на всякий случай напоминаем его. "Точное" значение π есть результат деления длины произвольной окружности на ее диаметр. Если в окружность фиксированного радиуса последовательно вписывать правильные многоугольники, начав, скажем, с квадрата, и удваивая на каждом шаге процесса число сторон, то очередное приближение для длины окружности получается как длина периметра соответствующего многоугольника. При этом с каждой очередной итерацией периметр все меньше отличается от окружности. Разница между искомой величиной и очередным приближением называется абсолютной невязкой. Стало быть, абсолютная невязка для приближенного значения числа π уменьшается с очередной итерацией. Разумеется, без знания точного значения нет возможности проверять, достаточно ли мала абсолютная невязка, чтобы удовлетворить заданной точности вычислений. Поэтому, взамен, проверяется невязка относительная, которая представляет собой разность, без знака, между двумя последовательными приближениями. Соответственно, процесс можно остановить по достижении относительной невязкой заданной точности. Например, для достижения в таком процессе часто используемого в вычислениях значения π = 3.14 следует дождаться, пока невязка станет меньше 0.01.

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

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


Упражнение 2

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

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

Ваша задача состоит, естественно, в написании программы. Предлагается вычислить методом левых прямоугольников определенный интеграл для функции y=ax2+b на интервале [0,c], причем точность и параметры ab и c>0 являются входными данными. В качестве ответа выдается количество необходимых итераций.

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

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

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

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

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

Или: как высоко может прыгнуть вверх спортсмен, не прибегая к специальным приспособлениям? В качестве приближенного значения кажется разумным принять текущее мировое достижение. Его превышение очередным атлетом дает новую итерацию, уменьшая абсолютную невязку с неким "точным", но практически недостижимым результатом. В этом смысле, похоже, мы имеем дело с приближенным алгоритмом. С другой стороны, изменение спортивной техники выполнения прыжка может существенно сдвинуть планку высших достижений, как это случилось при переходе от стиля "перекидной" к "фосбюри-флопу". Не примени американец Фосбюри свой "флоп", и мы вполне могли оставаться в неведении, принимая приближающийся с годами локальный экстремум прежнего стиля за экстремум абсолютный.

<<< Предыдущий урок Следующий урок >>>

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

создано: 2014-10-12
обновлено: 2021-03-13
132612



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Алгоритмы и теория алгоритмов

Термины: Алгоритмы и теория алгоритмов