Дисциплина «Алгоритмы и структуры данных» ИВТ УлГТУ: различия между версиями
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
== Новости и замечания == | == Новости и замечания == | ||
Для более быстрой связи лучше использовать v.folunin@gmail.com вместо v.folunin@ulstu.ru (со второго адреса пересылка выполняется не так оперативно). | Для более быстрой связи лучше использовать v.folunin@gmail.com вместо v.folunin@ulstu.ru (со второго адреса пересылка выполняется не так оперативно). | ||
== Ответы редакции на письма читателей == | |||
=== О компараторах === | |||
'''Вопрос:''' Когда для сортировки я использую компаратор вида <tt>return a.x < b.x;</tt>, всё работает, но стоит мне изменить компаратор на <tt>return a.x <= b.x;</tt>, как я получаю ошибку «invalid comparator». С чем это связано? | |||
'''Ответ:''' Компаратор <tt>f(a, b)</tt> для функции <tt>sort()</tt> (а также для <tt>set</tt> и <tt>map</tt>) должен определять ''строгий частичный порядок'' (strict weak ordering) на элементах множества. Это означает, что должны выполняться следующие свойства: | |||
* Антирефлексивность: всегда <tt>f(a, a) == false</tt> (ни один элемент не может идти до самого себя); | |||
* Антисимметричность: если <tt>f(a, b) == true</tt>, то <tt>f(b, a) == false</tt> (если a идёт до b, то b не может идти до a); | |||
* Транзитивность: если <tt>f(a, b) == true</tt> и <tt>f(b, c) == true</tt>, то <tt>f(a, c) == true</tt> (если a идёт до b, а b — до c, то a идёт до c). | |||
Функция <tt>sort()</tt> использует компаратор так: | |||
* Если <tt>f(a, b)</tt>, то a «меньше» b; | |||
* Если <tt>!f(a, b)</tt> и <tt>f(b, a)</tt>, то a «больше» b; | |||
* Если <tt>!f(a, b)</tt> и <tt>!f(b, a)</tt>, то a «равно» b. | |||
Сортировка не сможет упорядочить элементы правильно, если одновременно будут истинны <tt>f(a, b)</tt> и <tt>f(b, a)</tt>. Если используется компаратор вида <tt>return a.x <= b.x;</tt>, то при одинаковых значениях <tt>x</tt> у разных элементов эти элементы не смогут быть упорядочены, так как получается, что каждый из них должен идти перед другим (не говоря уже о сравнении элемента с самим собой). Поэтому возникает исключение. | |||
== Материалы по программированию на C++ == | == Материалы по программированию на C++ == |
Версия от 13:06, 28 сентября 2017
Новости и замечания
Для более быстрой связи лучше использовать v.folunin@gmail.com вместо v.folunin@ulstu.ru (со второго адреса пересылка выполняется не так оперативно).
Ответы редакции на письма читателей
О компараторах
Вопрос: Когда для сортировки я использую компаратор вида return a.x < b.x;, всё работает, но стоит мне изменить компаратор на return a.x <= b.x;, как я получаю ошибку «invalid comparator». С чем это связано?
Ответ: Компаратор f(a, b) для функции sort() (а также для set и map) должен определять строгий частичный порядок (strict weak ordering) на элементах множества. Это означает, что должны выполняться следующие свойства:
- Антирефлексивность: всегда f(a, a) == false (ни один элемент не может идти до самого себя);
- Антисимметричность: если f(a, b) == true, то f(b, a) == false (если a идёт до b, то b не может идти до a);
- Транзитивность: если f(a, b) == true и f(b, c) == true, то f(a, c) == true (если a идёт до b, а b — до c, то a идёт до c).
Функция sort() использует компаратор так:
- Если f(a, b), то a «меньше» b;
- Если !f(a, b) и f(b, a), то a «больше» b;
- Если !f(a, b) и !f(b, a), то a «равно» b.
Сортировка не сможет упорядочить элементы правильно, если одновременно будут истинны f(a, b) и f(b, a). Если используется компаратор вида return a.x <= b.x;, то при одинаковых значениях x у разных элементов эти элементы не смогут быть упорядочены, так как получается, что каждый из них должен идти перед другим (не говоря уже о сравнении элемента с самим собой). Поэтому возникает исключение.
Материалы по программированию на C++
- Курс «Введение в программирование на C++» от Яндекса и НИУ ВШЭ
- Краткая справка по указателям
- Исчерпывающее описание стандартной библиотеки
Лекции
Конспект
В 2016 г. составлялся студентами. В настоящее время неспешно переписывается преподавателем.
План
- Сложность алгоритмов. Сортировки
- Правила асимптотического анализа алгоритмов. Асимптотические обозначения. Основные классы сложности.
- Сортировки: выбором, вставками, слиянием, быстрая. Ω-оценка для сортировок сравнением.
- Устойчивость сортировок. Сортировки за линейное время: подсчётом, поразрядная.
- Бинарный поиск
- Бинарный поиск элемента в отсортированном массиве. Поиск первого и последнего вхождения.
- Бинарный поиск по ответу.
- Вещественный бинарный поиск.
- Тернарный поиск.
- Динамическое программирование. Жадные алгоритмы
- Решение задач комбинаторной оптимизации: полный перебор и методы его сокращения.
- Жадные алгоритмы. Принцип жадного выбора. Задачи: непрерывный рюкзак, выбор заявок, размен монет, коды Хаффмана.
- Динамическое программирование. Критерии применимости ДП. Ленивая рекурсия и просмотр вперёд. Восстановление решения.
- Виды одномерной и двумерной динамики.
- Структуры данных. Расширяющийся массив. Список
- Смежные и связные структуры данных. Работа с классами и динамической памятью.
- Понятие амортизированной сложности. Стратегии реализации динамического массива.
- Реализации списков.
- Сравнение быстродействия основных операций для массивов и списков.
- Стек. Очередь. Очередь с приоритетами
- Стек LIFO: реализация на массиве и связном списке. Классические приложения стека.
- Очередь FIFO: реализация на циклическом массиве и связном списке. Классические приложения очереди. Дек.
- Интерфейс очереди с приоритетами. Двоичная куча.
- Деревья. Хеш-таблицы
- Интерфейс АТД «Множество» и «Словарь».
- Двоичные деревья поиска. Поиск, добавление и удаление элементов: рекурсивная и нерекурсивная реализация.
- Принципы функционирования хеш-таблиц. Разрешение коллизий: метод цепочек, открытая адресация.
- Балансирующиеся деревья
- Недостатки наивной реализации двоичного дерева поиска.
- Обзор балансирующихся деревьев: 2-3-, красно-чёрные и AA-деревья.
- Декартово дерево. Реализация интерфейса АТД «Множество» и «Словарь».
- Множественные операции в декартовом дереве.
- Графы. Поиск в глубину
- Представление графа. Матрица смежности, списки смежности, список рёбер.
- Поиск в глубину.
- Компоненты связности.
- Поиск циклов.
- Топологическая сортировка.
- Компоненты сильной связности.
- Поиск мостов.
- Кратчайшие пути
- Кратчайшие пути в невзвешенном графе. Поиск в ширину.
- Кратчайшие пути в графе с неотрицательными весами. Алгоритм Дейкстры за O(V2) и за O(ElogV).
- Кратчайшие пути в ациклических орграфах.
- Кратчайшие пути в графе с отрицательными весами. Алгоритм Форда-Беллмана.
- Кратчайшие пути между всеми парами вершин. Алгоритм Флойда.
- Проверка графа на наличие отрицательного цикла.
- Минимальный остов. Система непересекающихся множеств
- Алгоритм Прима.
- Алгоритм Краскала.
- Структура данных «Система непересекающихся множеств» и её эвристики.
Практика
К каждой лекции прилагается комплект задач на vtcloud9. Задачи можно решать на C++ или Java.
Решения задач каждого комплекта засчитываются в течение одной недели после конца лекции. Если вы не смогли решить комплект по уважительной причине, сообщите преподавателю.
Курсовая работа
(будет добавлено позднее)
Экзамен
(будет добавлено позднее)