Опубликован: 05.01.2015 | Доступ: свободный | Студентов: 2016 / 0 | Длительность: 63:16:00
Лекция 1:

Введение

Лекция 1: 123456 || Лекция 2 >
Аннотация: В лекции дается объяснение понятия "алгоритм", приводятся некоторые примеры и утверждения об алгоритмах.

Алгоритмы

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

В основном представляющие интерес алгоритмы тесно связаны с методами организации данных, участвующих в вычислениях. Созданные таким образом объекты называются структурами данных, и они также являются центральными объектами изучения в компьютерных науках. То есть алгоритмы и структуры данных идут рука об руку. В этом курсе мы покажем, что структуры данных существуют в качестве побочных или конечных продуктов алгоритмов и, следовательно, их нужно изучить, чтобы понять алгоритмы. Простые алгоритмы могут порождать сложные структуры данных и наоборот, сложные алгоритмы могут использовать простые структуры данных. В этом курсе будут изучены свойства множества структур данных, так что курс вполне мог бы называться "Алгоритмы и структуры данных на C++".

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

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

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

Совместное использование программ в компьютерных системах становится все более распространенным, поэтому, хотя можно ожидать, что использовать придется многие из рассмотренных в курсе алгоритмов, одновременно можно надеяться, что реализовывать придется лишь немногие из них. Например, библиотека стандартных шаблонов (Standard Template Library) C++ содержит реализации множества базовых алгоритмов. Однако реализация простых версий основных алгоритмов позволяет лучше их понять и, следовательно, эффективнее использовать и настраивать более совершенные библиотечные версии. И что еще важнее, очень часто возникает необходимость самостоятельной реализации основных алгоритмов. Основная причина состоит в том, что мы очень часто сталкиваемся с совершено новыми вычислительными средами (аппаратными и программными), новые свойства которых не могут наилучшим образом использоваться старыми реализациями. То есть чтобы наши решения были более переносимыми и применимыми, часто приходится реализовывать базовые алгоритмы, приспособленные к конкретной задаче, а не основывающиеся на системных подпрограммах. Другая часто возникающая причина самостоятельной реализации базовых алгоритмов заключается в том, что несмотря на усовершенствования, встроенные в C++, механизмы, используемые для совместного использования программ, не всегда достаточно мощны, чтобы библиотечные программы можно было легко приспособить к эффективному выполнению конкретных задач.

Компьютерные программы часто чрезмерно оптимизированы. Обеспечение наиболее эффективной реализации конкретного алгоритма может не стоить затраченных усилий, если только алгоритм не должен использоваться для решения очень сложной задачи или же многократно. В противном случае вполне сгодится качественная, сравнительно простая реализация: достаточно быть уверенным в ее работоспособности и в том, что, скорее всего, в худшем случае она будет работать в 5—10 раз медленнее наиболее эффективной версии, что может означать увеличение времени выполнения на несколько дополнительных секунд. И напротив, правильный выбор алгоритма может ускорить работу в 100—1000 и более раз, что во время выполнения может сэкономить минуты, часы и даже более того. В этом курсе основное внимание уделяется простейшим приемлемым реализациям наилучших алгоритмов.

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

Лекция 1: 123456 || Лекция 2 >
Никита Андриянов
Никита Андриянов
Дмитрий Уколов
Дмитрий Уколов
Владимир Хаванских
Владимир Хаванских
Россия, Москва, Высшая школа экономики
Вадим Рычков
Вадим Рычков
Россия, Москва, МГТУ Станкин