SlideShare a Scribd company logo
1 of 11
Основы анализа алгоритмов
(продолжение)

5. Стандартные классы
сложности
Все задачи делят на следующие три класса: Р,
NP и NPC.
Класс Р состоит из задач, разрешимых в течение
полиномиального времени работы. Точнее
говоря — это задачи, которые можно решить
за время O(nk), где k – некоторая константа, a
n – размер входных данных задачи.
Класс NP состоит из задач, решения которых
(полученные с помощью некоторых
алгоритмов) поддаются проверке в течение
полиномиального времени. Имеется в виду,
что если получено «оптимальное» решение, то
в течение времени, полиномиальным образом
зависящего от размера входных данных
задачи, можно проверить корректность его
решения.
Любая задача класса Р принадлежит классу
NP, т.е. Р ⊆ NP. Однако остается открытым
вопрос, является ли Р строгим подмножеством
NP.
Задача принадлежит классу NPC (такие задачи
называются NP-полными – NP-complete), если
она принадлежит классу NP и является такой
же «сложной», как и любая задача из класса
NP, т.е. к ней полиномиально должны
сводиться все задачи из класса NP. Это
значит, что если любую NP-полную задачу
можно решить в течение полиномиального
времени, то для каждой задачи из класса NP
существует алгоритм с полиномиальным
временем работы.
Для практических целей можно выделить также еще два
класса задач.
Экспоненциальной по природе считается задача
сложностью не менее порядка xn, где x – константа
или полином от n. Экспоненциальные задачи относят к
классу E. Соответственно, и алгоритмы, в оценку
сложности которых n входит в показатель степени,
относятся к экспоненциальным алгоритмам. При
небольших значениях n экспоненциальный алгоритм
может быть даже менее сложным, чем
полиномиальный. Различие между этими типами
алгоритмов весьма велико и проявляется при больших
значениях n.
Особую группу по значениям сложности, близким к
полиномиальным, составляют задачи (и
соответственно алгоритмы), сложность которых
является полиномиальной функцией от logn (поскольку
logn растет медленнее, чем n).
6. Эмпирические измерения
характеристик выполнения
программы
Анализ алгоритмов должен служить практической
цели разработки программ.
Правильно разработанные программы на
реальном языке, например C++, представляют
собой эффективные методы выражения
алгоритмов.
На практике бывает необходимо описывать
алгоритмы и уделять внимание их
динамическим свойствам экспериментальным
путем.
При анализе каждого алгоритма уделяется
внимание, в основном, существенным
характеристикам производительности
алгоритма. Предполагается, что главный
интерес вызывают наиболее простые алгоритмы
с наилучшими показателями
производительности.
Для эффективного использования алгоритмов,
если нашей целью является решение огромной
задачи, которую нельзя решить другим
способом, или если цель заключается в
эффективной реализации важной части
системы, нам требуется понимание
характеристик производительности алгоритмов.
Формирование такого понимания и является
целью анализа алгоритмов.
Один из первых шагов для продвижения вперед в
понимании производительности алгоритмов –
это эмпирический анализ.
Если есть два алгоритма для решения одной
задачи, то, запустив оба и определив, который
выполняется дольше, мы получаем
необходимую информацию.
Первая проблема, возникающая перед
исследователями в эмпирическом анализе – это
разработка корректной и полной реализации.
Обычно требуется либо с помощью анализа, либо
путем экспериментирования с похожими
программами, установить некоторый признак,
насколько эффективной может быть программа,
до того как тратить усилия на ее реализацию.
Вторая проблема– это определение
природы входных данных и других
факторов, оказывающих прямое влияние
на производимые эксперименты.
Обычно существуют три основных
возможности: реальные данные,
случайные данные и ошибочные данные.
Реальные данные позволяют точно
измерить параметры используемой
программы; случайные данные
гарантируют, что наши эксперименты
тестируют алгоритм, а не данные;
ошибочные данные гарантируют, что наши
программы могут воспринимать любой
Проблема определения, какие данные
необходимо использовать для сравнения
алгоритмов, возникает также и при
анализе алгоритмов. При сравнении
различных реализаций легко допустить
ошибки, особенно, если в игру вступают
разные машины, компиляторы или
системы, либо гигантские программы с
плохо охарактеризованным вводом.
Принципиальная опасность при
эмпирическом сравнении программ таится
в том, что код для одной реализации
может быть создан более тщательно, чем
для другой.
Один из подходов заключается в построении
алгоритмов за счет внесения небольших
изменений в алгоритмы, существующие для
данной задачи, поэтому сравнительное изучение
просто необходимо. Для этого можно
определить важнейшие абстрактные операции и
сравнивать алгоритмы на основе того, как они
используют такие операции.
Возможно, наиболее распространенной ошибкой
при выборе алгоритма является упущение
характеристик производительности.
Возможно, вторая наиболее распространенная
ошибка при выборе алгоритма, – уделять
слишком много внимания характеристикам его
производительности.
Невозможно провести эмпирические тесты
для программы, которая еще не написана,
но мы можем проанализировать свойства
программы и оценить потенциальную
эффективность предлагаемого
улучшения.

More Related Content

What's hot

TMPA-2015: Formal Methods in Robotics
TMPA-2015: Formal Methods in RoboticsTMPA-2015: Formal Methods in Robotics
TMPA-2015: Formal Methods in RoboticsIosif Itkin
 
Тест-дизайн: проще читать или проще писать
Тест-дизайн: проще читать или проще писатьТест-дизайн: проще читать или проще писать
Тест-дизайн: проще читать или проще писатьSQALab
 
Математика для тестировщиков
Математика для тестировщиковМатематика для тестировщиков
Математика для тестировщиковSQALab
 
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютереПрограммирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютереAndrey Dolinin
 
Парадигмы программирования
Парадигмы программированияПарадигмы программирования
Парадигмы программированияITCP Community
 
Алгоритмы
АлгоритмыАлгоритмы
АлгоритмыSchool 242
 
Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"OdessaQA
 

What's hot (12)

TMPA-2015: Formal Methods in Robotics
TMPA-2015: Formal Methods in RoboticsTMPA-2015: Formal Methods in Robotics
TMPA-2015: Formal Methods in Robotics
 
Тест-дизайн: проще читать или проще писать
Тест-дизайн: проще читать или проще писатьТест-дизайн: проще читать или проще писать
Тест-дизайн: проще читать или проще писать
 
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
Багдатов Методы автоматического выявления плагиата в текстах компьютерных про...
 
8 инф
8 инф8 инф
8 инф
 
Математика для тестировщиков
Математика для тестировщиковМатематика для тестировщиков
Математика для тестировщиков
 
информатика лекции 4
информатика лекции 4информатика лекции 4
информатика лекции 4
 
Программирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютереПрограммирование как этап решения задач на компьютере
Программирование как этап решения задач на компьютере
 
Парадигмы программирования
Парадигмы программированияПарадигмы программирования
Парадигмы программирования
 
Pre al
Pre alPre al
Pre al
 
Алгоритмы
АлгоритмыАлгоритмы
Алгоритмы
 
Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"Тест-дизайн в тестировании ПО. Задача "Треугольник"
Тест-дизайн в тестировании ПО. Задача "Треугольник"
 
Tpo 06
Tpo 06Tpo 06
Tpo 06
 

Similar to лекция 6

Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
 
практика 5
практика 5практика 5
практика 5student_kai
 
Тестирование параллельных программ
Тестирование параллельных программТестирование параллельных программ
Тестирование параллельных программTatyanazaxarova
 
Надежный тест-дизайн
Надежный тест-дизайнНадежный тест-дизайн
Надежный тест-дизайнSQALab
 
presentation Algoritm
presentation Algoritmpresentation Algoritm
presentation Algoritmklochkova
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rusMaxim Shaptala
 
Введение в машинное обучение
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучениеGrigory Sapunov
 
презентации по информатике
презентации по информатикепрезентации по информатике
презентации по информатикеNick535
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Sergey Nemchinsky
 
Programming Concepts
Programming ConceptsProgramming Concepts
Programming ConceptsMister_Lee
 
Автоматизация.pptx
Автоматизация.pptxАвтоматизация.pptx
Автоматизация.pptxMadirimovShohrux
 
вспомогательные алгоритмы
вспомогательные алгоритмывспомогательные алгоритмы
вспомогательные алгоритмыЕлена Ключева
 
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММITMO University
 
Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмовAndrey Dolinin
 

Similar to лекция 6 (20)

лек11 7
лек11 7лек11 7
лек11 7
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
практика 5
практика 5практика 5
практика 5
 
пр 15.docx
пр 15.docxпр 15.docx
пр 15.docx
 
прак 15.docx
прак 15.docxпрак 15.docx
прак 15.docx
 
Тестирование параллельных программ
Тестирование параллельных программТестирование параллельных программ
Тестирование параллельных программ
 
Надежный тест-дизайн
Надежный тест-дизайнНадежный тест-дизайн
Надежный тест-дизайн
 
presentation Algoritm
presentation Algoritmpresentation Algoritm
presentation Algoritm
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rus
 
Введение в машинное обучение
Введение в машинное обучениеВведение в машинное обучение
Введение в машинное обучение
 
TAP
TAPTAP
TAP
 
презентации по информатике
презентации по информатикепрезентации по информатике
презентации по информатике
 
1
11
1
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
Programming Concepts
Programming ConceptsProgramming Concepts
Programming Concepts
 
Автоматизация.pptx
Автоматизация.pptxАвтоматизация.pptx
Автоматизация.pptx
 
вспомогательные алгоритмы
вспомогательные алгоритмывспомогательные алгоритмы
вспомогательные алгоритмы
 
лекция 4
лекция 4лекция 4
лекция 4
 
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ К ГЕНЕРАЦИИ ТЕСТОВ ДЛЯ АВТОМАТНЫХ ПРОГРАММ
 
Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмов
 

More from student_kai

презентация
презентацияпрезентация
презентацияstudent_kai
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкетаstudent_kai
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке Cstudent_kai
 
презентация курсовой работы
презентация курсовой работыпрезентация курсовой работы
презентация курсовой работыstudent_kai
 
лекция№34
лекция№34лекция№34
лекция№34student_kai
 
лекция№32
лекция№32лекция№32
лекция№32student_kai
 
лекция№33
лекция№33лекция№33
лекция№33student_kai
 
лекция№31
лекция№31лекция№31
лекция№31student_kai
 
лекция№30
лекция№30лекция№30
лекция№30student_kai
 
лекция№29
лекция№29лекция№29
лекция№29student_kai
 
лекция№28
лекция№28лекция№28
лекция№28student_kai
 
лекция№27
лекция№27лекция№27
лекция№27student_kai
 
лекция№26
лекция№26лекция№26
лекция№26student_kai
 
лекция№25
лекция№25лекция№25
лекция№25student_kai
 
лекция№25
лекция№25лекция№25
лекция№25student_kai
 
лекция№24
лекция№24лекция№24
лекция№24student_kai
 
лекция№23
лекция№23лекция№23
лекция№23student_kai
 
лекция№22
лекция№22лекция№22
лекция№22student_kai
 
лекция№21
лекция№21лекция№21
лекция№21student_kai
 
лекция№20
лекция№20лекция№20
лекция№20student_kai
 

More from student_kai (20)

презентация
презентацияпрезентация
презентация
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке C
 
презентация курсовой работы
презентация курсовой работыпрезентация курсовой работы
презентация курсовой работы
 
лекция№34
лекция№34лекция№34
лекция№34
 
лекция№32
лекция№32лекция№32
лекция№32
 
лекция№33
лекция№33лекция№33
лекция№33
 
лекция№31
лекция№31лекция№31
лекция№31
 
лекция№30
лекция№30лекция№30
лекция№30
 
лекция№29
лекция№29лекция№29
лекция№29
 
лекция№28
лекция№28лекция№28
лекция№28
 
лекция№27
лекция№27лекция№27
лекция№27
 
лекция№26
лекция№26лекция№26
лекция№26
 
лекция№25
лекция№25лекция№25
лекция№25
 
лекция№25
лекция№25лекция№25
лекция№25
 
лекция№24
лекция№24лекция№24
лекция№24
 
лекция№23
лекция№23лекция№23
лекция№23
 
лекция№22
лекция№22лекция№22
лекция№22
 
лекция№21
лекция№21лекция№21
лекция№21
 
лекция№20
лекция№20лекция№20
лекция№20
 

лекция 6

  • 1. Основы анализа алгоритмов (продолжение) 5. Стандартные классы сложности
  • 2. Все задачи делят на следующие три класса: Р, NP и NPC. Класс Р состоит из задач, разрешимых в течение полиномиального времени работы. Точнее говоря — это задачи, которые можно решить за время O(nk), где k – некоторая константа, a n – размер входных данных задачи. Класс NP состоит из задач, решения которых (полученные с помощью некоторых алгоритмов) поддаются проверке в течение полиномиального времени. Имеется в виду, что если получено «оптимальное» решение, то в течение времени, полиномиальным образом зависящего от размера входных данных задачи, можно проверить корректность его решения.
  • 3. Любая задача класса Р принадлежит классу NP, т.е. Р ⊆ NP. Однако остается открытым вопрос, является ли Р строгим подмножеством NP. Задача принадлежит классу NPC (такие задачи называются NP-полными – NP-complete), если она принадлежит классу NP и является такой же «сложной», как и любая задача из класса NP, т.е. к ней полиномиально должны сводиться все задачи из класса NP. Это значит, что если любую NP-полную задачу можно решить в течение полиномиального времени, то для каждой задачи из класса NP существует алгоритм с полиномиальным временем работы.
  • 4. Для практических целей можно выделить также еще два класса задач. Экспоненциальной по природе считается задача сложностью не менее порядка xn, где x – константа или полином от n. Экспоненциальные задачи относят к классу E. Соответственно, и алгоритмы, в оценку сложности которых n входит в показатель степени, относятся к экспоненциальным алгоритмам. При небольших значениях n экспоненциальный алгоритм может быть даже менее сложным, чем полиномиальный. Различие между этими типами алгоритмов весьма велико и проявляется при больших значениях n. Особую группу по значениям сложности, близким к полиномиальным, составляют задачи (и соответственно алгоритмы), сложность которых является полиномиальной функцией от logn (поскольку logn растет медленнее, чем n).
  • 5. 6. Эмпирические измерения характеристик выполнения программы Анализ алгоритмов должен служить практической цели разработки программ. Правильно разработанные программы на реальном языке, например C++, представляют собой эффективные методы выражения алгоритмов. На практике бывает необходимо описывать алгоритмы и уделять внимание их динамическим свойствам экспериментальным путем.
  • 6. При анализе каждого алгоритма уделяется внимание, в основном, существенным характеристикам производительности алгоритма. Предполагается, что главный интерес вызывают наиболее простые алгоритмы с наилучшими показателями производительности. Для эффективного использования алгоритмов, если нашей целью является решение огромной задачи, которую нельзя решить другим способом, или если цель заключается в эффективной реализации важной части системы, нам требуется понимание характеристик производительности алгоритмов. Формирование такого понимания и является целью анализа алгоритмов.
  • 7. Один из первых шагов для продвижения вперед в понимании производительности алгоритмов – это эмпирический анализ. Если есть два алгоритма для решения одной задачи, то, запустив оба и определив, который выполняется дольше, мы получаем необходимую информацию. Первая проблема, возникающая перед исследователями в эмпирическом анализе – это разработка корректной и полной реализации. Обычно требуется либо с помощью анализа, либо путем экспериментирования с похожими программами, установить некоторый признак, насколько эффективной может быть программа, до того как тратить усилия на ее реализацию.
  • 8. Вторая проблема– это определение природы входных данных и других факторов, оказывающих прямое влияние на производимые эксперименты. Обычно существуют три основных возможности: реальные данные, случайные данные и ошибочные данные. Реальные данные позволяют точно измерить параметры используемой программы; случайные данные гарантируют, что наши эксперименты тестируют алгоритм, а не данные; ошибочные данные гарантируют, что наши программы могут воспринимать любой
  • 9. Проблема определения, какие данные необходимо использовать для сравнения алгоритмов, возникает также и при анализе алгоритмов. При сравнении различных реализаций легко допустить ошибки, особенно, если в игру вступают разные машины, компиляторы или системы, либо гигантские программы с плохо охарактеризованным вводом. Принципиальная опасность при эмпирическом сравнении программ таится в том, что код для одной реализации может быть создан более тщательно, чем для другой.
  • 10. Один из подходов заключается в построении алгоритмов за счет внесения небольших изменений в алгоритмы, существующие для данной задачи, поэтому сравнительное изучение просто необходимо. Для этого можно определить важнейшие абстрактные операции и сравнивать алгоритмы на основе того, как они используют такие операции. Возможно, наиболее распространенной ошибкой при выборе алгоритма является упущение характеристик производительности. Возможно, вторая наиболее распространенная ошибка при выборе алгоритма, – уделять слишком много внимания характеристикам его производительности.
  • 11. Невозможно провести эмпирические тесты для программы, которая еще не написана, но мы можем проанализировать свойства программы и оценить потенциальную эффективность предлагаемого улучшения.