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

Введение

Лекция 1: 123456 || Лекция 2 >

Перспективы

Каждый из алгоритмов, рассмотренных в разделе 1.3, кажется определенным усовершенствованием предыдущего, но, вероятно, процесс был искусственно упрощен, поскольку разработка самих этих алгоритмов уже была выполнена рядом исследователей в течение многих лет (см. раздел использованной литературы). Реализации просты, а задача четко определена, поэтому мы можем оценить различные алгоритмы непосредственно, экспериментальным путем. Более того, мы можем подкрепить эти исследования, количественно сравнив производительность алгоритмов (см. "Принципы анализа алгоритмов" ). Не все задачи, рассмотренные в этом курсе, столь же хорошо проработаны, как эта, и мы обязательно встретимся с алгоритмами, которые трудно сравнить, и с математическими задачами, которые трудно решить. Мы стремимся принимать объективные научно обоснованные решения об используемых алгоритмах, изучая свойства реализаций на примере их выполнения применительно к реальным данным, полученным из приложений, или случайным тестовым наборам данных.

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

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

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

Что еще важнее, по мере повышения вычислительных возможностей компьютеров и приложений разрыв между быстрыми и медленными алгоритмами увеличивается. Новый компьютер может работать в 10 раз быстрее и может обрабатывать в 10 раз больше данных, чем старый, но при использовании квадратичного алгоритма, наподобие быстрого поиска, новому компьютеру потребуется в 10 раз больше времени для выполнения новой задачи, чем требовалось старому для выполнению старой! Вначале это утверждение кажется противоречивым, но его легко подтвердить простым тождеством (10N)2/10 = 10N2 , как будет показано в "Принципы анализа алгоритмов" . По мере того как вычислительные мощности увеличиваются, позволяя решать все более сложные задачи, важность использования эффективных алгоритмов также возрастает.

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

Упражнения

1.25. Допустим, что взвешенное быстрое объединение используется для обработки в 10 раз большего количества соединений на новом компьютере, который работает в 10 раз быстрее старого. На сколько больше времени потребуется для выполнения новой задачи на новом компьютере по сравнению с выполнением старой задачи на старом компьютере?

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

Обзор тем

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

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

  • Анализ (Часть I) в контексте данного курса это основные принципы и методология, используемые для реализации, анализа и сравнения алгоритмов. Материал, приведенный в "Введение" , служит обоснованием изучения разработки и анализа алгоритмов; в "Принципы анализа алгоритмов" рассмотрены основные методы получения информации о количественных показателях производительности алгоритмов.
  • Структуры данных (Часть II) тесно связаны с алгоритмами: необходимо получить ясное представление о методах представления данных, которые используются во всех остальных частях курса. Изложение материала начинается с введения в базовые структуры данных в "Элементарные структуры данных" : массивы, связанные списки и строки; затем в "Рекурсия и деревья" будут рассмотрены рекурсивные программы и структуры данных — а именно, деревья и алгоритмы для манипулирования ими. В "Абстрактные типы данных" рассмотрены основные абстрактные типы данных (abstract data types — ADT), такие как стеки и очереди, а также реализации с использованием элементарных структур данных.
  • Алгоритмы сортировки (Часть III), предназначенные для упорядочения файлов, имеют особую важность. Мы достаточно глубоко рассмотрим ряд базовых алгоритмов, в том числе быструю сортировку, сортировку слиянием и поразрядную сортировку. Попутно будут рассмотрены и несколько связанных задач: очереди приоритетов, выбор и слияние. Многие из этих алгоритмов лягут в основу других алгоритмов, рассматриваемых в последующих частях курса.
  • Алгоритмы поиска (Часть IV), предназначенные для поиска конкретных элементов в больших коллекциях элементов, также имеют важное значение. Мы рассмотрим основные и усовершенствованные методы поиска с использованием деревьев и преобразований числовых ключей: деревья бинарного поиска, сбалансированные деревья, хеширование, деревья цифрового поиска и методы, пригодные для очень больших файлов. Мы отметим взаимосвязь между этими методами, приведем статистические данные об их сравнительной производительности и установим соответствие с методами сортировки.

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

  • Алгоритмы на графах (Часть V) полезны при решении ряда сложных и важных задач. Общая стратегия поиска в графах разрабатывается и применяется к фундаментальным задачам связности, в том числе к задаче отыскания кратчайшего пути, минимального остовного дерева, к задаче о сетевом потоке и к задаче соответствия. Унифицированный подход к этим алгоритмам показывает, что все они основываются на одной и той же процедуре, и что эта процедура основывается на основном абстрактном типе данных очереди приоритетов.
  • Алгоритмы обработки строк (часть VI) включают в себя ряд методов обработки последовательностей символов (длинных). Поиск строк требует сравнения с шаблоном, что, в свою очередь, приводит к синтаксическому анализу. В этой же части рассматриваются и технологии сжатия файлов. Опять-таки, введение в более сложные темы выполняется через рассмотрение некоторых простых задач, которые важны и сами по себе.
  • Геометрические алгоритмы (Часть VII) — это методы решения задач с использованием точек и линий (и других простых геометрических объектов), которые стали использоваться лишь недавно. Мы рассмотрим алгоритмы для отыскания образующей поверхности, определенной набором точек, определения пересечений геометрических объектов, решения задач отыскания ближайших точек и для выполнения многомерного поиска. Многие из этих методов прекрасно дополняют более элементарные методы сортировки и поиска.
  • Дополнительные темы (Часть VIII) устанавливают соответствие между изложенным в курсе материалом и несколькими другими областями. Изложение материала начинается с рассмотрения базовых подходов к разработке и анализу алгоритмов, в том числе алгоритмов типа "разделяй и властвуй", динамического программирования, рандомизации и амортизации. Мы рассмотрим линейное программирование, быстрое преобразование Фурье, NP-полноту и другие дополнительные темы для получения общего представления о ряде областей, интерес к которым порождается элементарными проблемами, рассмотренными в этом курсе.

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

Лекция 1: 123456 || Лекция 2 >
Дмитрий Уколов
Дмитрий Уколов
Михаил Новопашин
Михаил Новопашин
Наталья Горбунова
Наталья Горбунова
Россия, Черноголовка