Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVET_OAIP.docx
Скачиваний:
22
Добавлен:
27.09.2019
Размер:
589.57 Кб
Скачать

47. Методы разработки алгоритмов. Метод декомпозиции, динамическое программирование

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

  1. Декомпозиции(разделения)

  2. Динамическое программирование

  3. “Жадные алгоритмы”

  4. Полный перебор (Поиск с возвратом)

  5. Локальный поиск

Динамическое программирование – способ решения сложных задач путём разбиения их на более простые подзадачи. Шаги решения задачи: 1) Описать строение оптимальных решений (определить задачи и подзадачи); 2) Выписать рекуррентное соотношение, связывающее оптимальное решения с оптимальными решениями подзадач; 3) Вычислить оптимальное значение, основанное на предварительно вычисленных оптимальных решениях подзадач.

Признаки использования динамического программирования:

- оптимальность задач (содержание оптимальности решения подзадач)

- перекрывающиеся задачи (малость множества подзадач)

Примеры задач: задача о порядке перемножения матриц, задача о наибольшей общей подпоследовательности, задача о рюкзаке. Декомпозиция — разбиение задачи большой размерности на подзадачи существенно меньшей размерности. Схема алгоритма: 1) задача разбивается на подзадачи (декомпозиция);2) каждая из них решается отдельно; 3)решения комбинируются. Декомпозиция, как процесс расчленения, позволяет рассматривать любую исследуемую систему как сложную, состоящую из отдельных взаимосвязанных подсистем, которые, в свою очередь, также могут быть расчленены на части. В качестве систем могут выступать не только материальные объекты, но и процессы, явления и понятия. Примеры задач : сортировка слиянием, двоичные деревья поиска, ханойские башни

48. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.

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

1.Декомпозиции(разделения)

2.Динамическое программирование

3.“Жадные алгоритмы”

4.Полный перебор (Поиск с возвратом)

5.Локальный поиск

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

В общем случае нельзя сказать, можно ли получить оптимальное решение с помощью жадного алгоритма применительно к конкретной задаче. Но есть две особенности, характерные для задач, которые решаются с помощью жадных алгоритмов: принцип жадного выбора и свойство оптимальности для подзадач. Принцип жадного выбора: Говорят, что к оптимизационной задаче применим принцип жадного выбора, если последовательность локально оптимальных выборов даёт глобально оптимальное решение. В этом состоит главное отличие жадных алгоритмов от динамического программирования: во втором просчитываются сразу последствия всех вариантов. Оптимальность для подзадач: Это свойство говорит о том, что оптимальное решение всей задачи содержит в себе оптимальные решения подзадач. Примеры задач : выдача сдачи, составление расписания, код Хаффмана. Поиск с возвратом — это метод перебора всех возможных решений для нахождения так называемого множества полных решений. Как правило позволяет решать задачи, в которых ставятся вопросы типа: «Перечислите все возможные варианты …», «Сколько существует способов …», «Есть ли способ …», «Существует ли объект…» и т. п.Незначительные модификации метода поиска с возвратом, связанные с представлением данных или особенностями реализации, имеют и иные названия: метод ветвей и границ, поиск в глубину, метод проб и ошибок и т. д.

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

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

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

49. Библиотеки С++. Структуры библиотеки STL

Библиотеки С++ : Стандартная библиотека std, STL, Loki, Boost, MFC, ATL, WTL, OpenGL, QT и др.

Стандартная библиотека шаблонов (STL) (англ. Standard Template Library) — набор хорошо сконструированных и согласованно работающих вместе обобщённых компонентов C++.

Библиотека содержит пять основных видов компонентов:

алгоритм (algorithm)- это функция для манипулирования объектами, содержащимися в контейнере.

контейнер (container)- это хранилище объектов (как встроенных, так и определённых пользователем типов).

итератор (iterator)- это абстракция указателя, то есть объект, который может ссылаться на другие объекты, содержащиеся в контейнере.

функциональный объект (function object)- инкапсулирует функцию в объекте для использования другими компонентами.

адаптер (adaptor)- адаптирует компонент для обеспечения различного интерфейса.

Контейнеры библиотеки STL можно разделить на четыре категории: последовательные(vector, list, deque), ассоциативные(set, multiset, map, multimap), контейнеры-адаптеры(stack, queue, priority_queue) и псевдоконтейнеры(bitset, basic_string, valarray).

50. Обзор библиотек С++ (Loki, Boost, MFC, ATL, WTL, OpenGL, QT и др.)

Qt — кросс-платформенный инструментарий разработки ПО на языке программирования C++.

Cостав: элементы графического интерфейса, классы для работы с сетью, базы данных и XML, ActiveX и COM, поддержка скриптов, OpenGL.

MFC (Microsoft Foundation Classes) — библиотека на языке C++ (Microsoft) для разработки GUI-приложений для Microsoft Windows.

автоматически создает по заданному макету интерфейс и берет на себя действия по его обслуживанию

WTL (Windows Template Library) — облегчённая альтернатива библиотеке MFC.

Поддерживает:

работу с окнами и диалогами, стандартными диалогами Windows, GDI, стандартными контролами, ActiveX, с основными элементами управления: меню, панели инструментов, кнопки, поля ввода, списки.

  1. Основы теории сложности. Классы сложности : NP, P.

  2. Сортировка и поиск. Проверка упорядоченности массива. Способы сортировки.

  3. Обменная  сортировка (метод «пузырька» , шейкер- сортировка).

  4. Сортировка разделением (быстрая сортировка) Распределяющая сортировка.

  5. Сортировка подсчетом. Сортировка выбором (прямой выбор, линейный выбор, квадратичная).

  6. Сортировка вставками. (Простая вставка, вставка погружением, метод Шелла)

  7. Пирамидальная сортировка. Сортировка слиянием (однократное и циклическое слияние).

  8. Стек. Основные базисные операции для работы со стеком. Организация стека на основе массива и связного списка.

  9. Очередь. Основные операции для работы с очередью.

  10. Очередь с приоритетом. Основные операции для работы с приоритетной очередью

  11. Деки. Логическая структура дека.

  12. Списки как динамические структуры данных. Виды линейных списков. Способы формирования односвязных списков. Оценка сложности.

  13. Односвязный список. Включение элемента в начало списка. Удаление элемента из списка по заданному номеру.

  14. Односвязный список. Включение элемента в конец списка. Слияние двух списков.

  15. Двусвязный список. Удаление и вставка элемента в список.

  16. Циклические списки. Просмотр циклического списка.

  17. Мультисписки. Нелинейные разветвленные списки.

  18. Особенности программирования рекурсивных функций. Линейная рекурсия (примеры).

  19. Смешанная, ветвящаяся и бинарная рекурсия (примеры).

  20. Рекурсия и поисковые задачи. Результат функции рекурсивного поиска, возврат последовательности, правила разработки.

  21. Рекурсия и поисковые задачи. Ханойские башни. Генераторы перестановок, сортировки, алгоритмы с матрицами и другие.

  22. Деревья как рекурсивные структуры данных. Основные определения и свойства. Логическое представление и изображение деревьев.

  23. Бинарные деревья. Вставка элемента.

  24. Бинарные деревья. Удаление элемента.

  25. Бинарные деревья. Поиск. Алгоритм представления любого дерева и леса бинарными деревьями.

  26. Способы обхода бинарного дерева: нисходящий, восходящий, смешанный.

  27. Поиск минимальной длины ветви дерева.

  28. Сбалансированные деревья. Показатель сбалансированности. AVL-деревья.

  29. Виды балансировки деревьев. Балансировка через массив.

  30. Красно-черные деревья.

  31. Приложения деревьев. Дерево Хаффмана.

  32. Бинарная куча. Проверка основного свойства кучи.

  33. Бинарная куча. Определение родительской и дочерних вершин.

  34. Бинарная куча. Алгоритм построения кучи из произвольного массива.

  35. Бинарная куча. Извлечение наибольшего элемента. Оценка сложности

  36. Бинарная куча. Добавление элемента.

  37. Обзор куч: левосторонние, биномиальные, фибоначевы, тонкие и др. Оценка сложности

  38. Хэш-таблицы. Понятие, назначение и принцип организации.

  39. Алгоритмы вычисления хэш-функции.

  40. Хэш-таблицы. Прямая адресация в хэш-таблицах.

  41. Хэш-таблицы. Коллизии. Построение цепочек.

  42. Хэш-таблицы. Открытая адресация в хэш-таблицах. Способы вычисления последовательности испробованных мест при открытой адресации (линейный, квадратичный).

  43. Хэш-таблицы. Основные свойства и эффективность.

  44. Задача поиска подстрок, простейший алгоритм.

  45. Задача поиска подстрок . Алгоритм Хорспула. Алгоритм Карпа-Рабина.

  46. Задача поиска подстрок . Алгоритм Бойера-Мура. Алгоритм Кнута-Морриса-Пратта

  47. Методы разработки алгоритмов. Метод декомпозиции, динамическое программирование.

  48. Методы разработки алгоритмов. Жадные алгоритмы, поиск с возвратом, локальный поиск.

  49. Библиотеки С++. Структура библиотеки STL.

  50. Обзор библиотек С++ (Loki, Boost, MFC, ATL, WTL, OpenGL, QT и др.)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]