Здесь работаю над презентациями, которые потом использую для чтения лекции по дисциплине Программирование ФИТ НГУ.
Ставьте звезды, создавайте issue, делайте пул-реквесты
- Информация о курсе
- Понятие программы
- Понятие компиляции, сборки, системы контроля версий
- Понятие отладки, оптимизации, тестирования
- Как выполнять лабораторные работы на gitlab.ccfit.nsu.ru
- Язык Си и современное программирование
- Пространства имён, области видимости имён и связывание имён
- Время жизни и продолжительность хранения переменных в памяти
- Лексемы языка Си -- ключевые слова, операторы, синтаксис констант
- Общие правила построения выражений
- Приоритет, ассоциативность и неявная расстановка скобок
- Понятие l-value
- Понятие точки следования
- Обзор операторов -- требования к операндам, исполнение, побочные эффекты, условия возникновения implementation-specific/unspecified/undefined behavior
- Понятие подпрограммы -- граф вызовов, стековый кадр, стек вызовов
- Функции в языке Си -- формальные и фактические параметры, возвращаемое значение, вариадические функции
- Понятие типа и системы типов языка программирования
- Семейства типов языка Си -- функциональные/полные/неполные, целые/с плавающей точкой/производные и т.д.
- Представление типов языка Си в памяти -- целые знаковые/беззнаковые, с плавающей точкой, производные и т.д.
- Понятие преобразования типа
- Преобразования целых и типов с плавающей точкой -- общий тип, целочисленное повышение (integer promotion), протяжка знака (sign propagation/extension)
- Преобразования массивов -- генерация указателя (pointer generation)
- Преобразования функциональных типов
- Преобразования с типом void
- Преобразования указателей
- Размещение в стековом кадре -- выравнивание, связь выравниваний производного типа и его элементов, выравнивающие байты
- Размещение в динамической памяти -- Doug Lea's malloc, накладные расходы, фрагментация памяти, виды ошибок, Address Sanitizer
- Понятие абстрактного типа данных (АТД) и реализации абстрактного типа данных
- АТД список
- АТД стек -- реализация через список, через массив
- Алгоритм построения польской записи арифметического выражения и вычисления польской записи
- АТД очередь -- реализации через список, через циклический буфер, через два стека
- АТД дек -- реализация через двусвязный список
- Граф -- определения, реализация через матрицу смежности, через списки смежности, через упакованные списки смежности
- Свойства матрицы смежности
- Использование деревьев в программировании
- Определения -- дерево, поддерево и т.п.
- Обходы деревьев в глубину и в ширину
- Дерево двоичного поиска -- поиск вершины, вставка и удаление вершины
- АВЛ деревья -- поиск вершины, вставка вершины, короткий и длинный поворот
- Общая постановка задачи поиска
- Поиск ключа в массиве и списке -- линейный, бинарный, хэш-таблицы
- Поиск подстроки в строке -- наивный, алгоритм Бойера-Мура, алгоритм Рабина-Карпа, алгоритм Кнута-Морриса-Пратта
- Понятие сортировки
- Сортировка вставками, сортировка бинарными вставками, устойчивая сортировка
- Сортировка выбором, пирамидальная сортировка
- Быстрая сортировка, неустойчивость быстрой сортировки
- Оценка числа действий и объёма дополнительной памяти в алгоритмах сортировки
- Исторические факты о кодировании
- Определения -- алфавит, кодирование и декодирование, код, двоичный код, префиксный код
- Однозначная декодируемость префиксного кода
- Оптимальный двоичный префиксный код Хаффмана
- Префиксный код Фано
- Префиксный код Шеннона, оценка сверху для длины закодированного сообщения через частоты символов, формулировка теоремы Шеннона
- Использование графов в программировании, понятие обхода вершин графа
- Обход вершин графа в глубину, подграф предшествования, типы дуг графа при обходе в глубину, оценка числа действий при обходе всех вершин графа
- Обход вершин графа в ширину на основе очереди, свойство очереди вершин при обходе в ширину
- Компоненты связности графа, АТД система непересекающихся множеств (СНМ), реализации СНМ через массив и через деревья, оценка числа действий
- Каркас графа, минимальный каркас графа
- Алгоритм Краскала, оценка числа действий
- Алгоритм Прима, оценка числа действий, доказательство корректности
- Определение длины пути, кратчайшего пути, примеры
- Алгоритм Дейкстры, число действий при хранении кратчайших расстояний в массиве, пирамиде и Фибоначчиевой куче
- Кратчайший путь в графе без циклов отрицательной длины
- Алгоритм Беллмана-Форда для графов с произвольными длинами дуг
- Алгоритм Флойда-Уоршелла вычисления кратчайших расстояний между всеми парами вершин графа и его применения (построение транзитивного замыкания графа, подсчёт путей с фиксированным числом вершин)
- Определение топологической сортировки графа
- Нерекурсивный алгоритм топологической сортировки графа на основе матрицы смежности и списков смежности
- Алгоритм топологической сортировки на основе поиска в глубину
- Связь алгоритма топологической сортировки и теоремы о продолжении частичного порядка до линейного
- Общие сведения о Б деревьях (B trees)
- Определение Б дерева, оценка высоты Б дерева с заданным числом вершин
- Алгоритмы поиска и вставки вершины в Б дерево
- Общие сведения о красно-чёрных деревьях
- Определение красно-чёрного дерева, оценка высоты красно-чёрного дерева с заданным числом вершин
- Алгоритм вставки вершины в красно-чёрное дерево
- Сравнение красно-чёрных и АВЛ деревьев по числу действий в алгоритмах поиска и вставки
- Красно-чёрные деревья как частный случай Б деревьев
- Применение красно-чёрных деревьев в С++
- Элементы теории сложности вычислений: задача, исполняющее устройство, классы задач P и NP, NP-полные задачи
- Поиск с возвратом как обход в глубину
- Поиск с возвратом как эмуляция работы недетерминированного исполняющего устройства
- Понятие эвристического поиска с возвратом
- Решение задач обхода шахматной доски конём и расстановки ферзей методом поиска с возвратом
- Динамическое программирование как метод решения задач оптимального управления -- управляемая система, целевая функция, оптимальное управление
- Принцип оптимальности Беллмана
- Прямой и обратный ход
- Примеры решения задач методом динамического программирования -- суммирование набора, задача о рюкзаке, оптимальное произведение матриц
- Связь метода динамического программирования и метода поиска с возвратом
- Практический смысл оценки сложности
- Понятие размера данных, объёма используемой памяти и вычислений на примерах (умножение матриц, сортировка вставками, проверка на простоту)
- Понятие сложности по памяти и по времени в худшем случае и в среднем
- Связь сложности в худшем случае и в среднем, связь сложности по времени и памяти
- Пример получения оценки сложности по времени в среднем для алгоритма возведения в целую степень методом повторных квадратов
- Особенности оценки вычислительной сложности на практике
- Оценка сверху сложности по времени в худшем случае на основе исходного кода без рекурсии
- Понятие оптимальной программы и асимптотически оптимальной программы
- Понятие дерева трасс исполнения программы
- Пример доказательства оптимальности по числу сравнений в худшем случае для алгоритма быстрого поиска минимума и максимума в массиве
- Определение перестановки и инверсии
- Алгоритм восстановления перестановки по таблице инверсий
- Определение факториальной системы счисления; алгоритм перечисления таблиц инверсий
- Алгоритм перечисления перестановок на основе таблицы инверсий
- Алгоритм Дейкстры непосредственного перечисления перестановок в алфавитном порядке
- Оценка сложности по времени в среднем для алгоритма Дейкстры
- Использование формальных грамматик в программировании, БНФ как прототип формальной грамматики
- Определение грамматики, вывода в грамматике, языка, описываемого грамматикой
- Пример грамматики, описывающей язык с цепочками квадратичной длины
- Классификация грамматик по Хомскому и связь типов грамматик с алгоритмической вычислимостью
- Пример классической грамматики типа 1 anbncn
- Метод построения LL(1) анализатора грамматик типа 2 -- алгоритм анализа на основе таблицы, алгоритмы построения первого и следующего набора
- Понятие препроцессирования исходного кода, несколько фактов о создании препроцессора языка Си
- Этапы работы препроцессора языка Си
- Директивы препроцессора языка Си и выполняемые ими преобразования исходного кода, общие правила записи директив
- Алгоритм исполнения директив препроцессора языка Си
- Объединение единиц трансляции -- примеры, синтаксис, правило поиска единиц трансляции в файловой системе
- Условная компиляция -- примеры, синтаксис, вычисление условий в директивах if и elif
- Макроподстановка -- примеры, синтаксис, алгоритм макроподстановки
- Служебные макроподстановки и вспомогательные директивы
- Особенности работы с большим исходным кодом
- Понятие модуля (части) программы
- Понятие зацепления модулей программы
- Виды зацепления модулей программы -- патологическое, по содержимому (content), по общей области (common), смешанное (hybrid), по управлению (control), по данным (data)
- Примеры кода на языке Си с зацеплением и пути устранения зацепления
- Рекомендации по именованию переменных и функций -- профилактика смешанного зацепления
- Рекомендации по повышению локальности переменных и функций -- профилактика патологического зацепления
- Понятие эффективности вычислений -- виды вычислительных ресурсов, виды требований к использованию ресурсов
- Факторы, влияющие на эффективность -- скорость работы процессора и памяти, виды узких мест
- Устранение узких мест -- использование специализированных библиотек и узнаваемых компилятором паттернов управления и зависимостей по данным, параллелизация
- Пример повышения эффективности умножения матриц на процессоре Intel с 5% до 85% от пика ядра
- Пример повышения эффективности транспонирования больших матриц на процессоре Intel с 20% до 60% от пика памяти
- Понятие многопоточности -- контекст исполнения, поток исполнения, многопоточное исполнение, отличия от многозадачности
- Краткий обзор ранней (до 1997 года) вычислительной техники, ОС и библиотек, поддерживающих многопоточность
- Примеры простого многопоточного кода на основе POSIX threads, OpenMP
- Многопоточность в стандарте языка Си C11 -- потоки, атомарные переменные, взаимное исключение потоков, сигналы (события)
- Понятие конфликта обращений к памяти, виды упорядочения доступов к атомарным переменным (memory order) в стандарте С11
- Примеры использования атомарных переменных -- синхронизация потоков producer-consumer, асинхронный счётчик
- Использование взаимного исключения потоков при доступе к ресурсам, взаимная блокировка потоков, приёмы её устранения
- Использование сигналов (событий) для передачи владения ресурсом другому потоку
- Эффективное использование многопоточности
- Основные понятия и определения машинного обучения, примеры задач регрессии, классификации и ранжирования -- на основе 1-й лекции из курса по машиинному обучению Воронцова К.В.
- Построение классификаторов изображений с помощью нейронных сетей -- примеры простых нейронных сетей Tiny VGG, CIFAR-10, GoogleNet
- Алгоритмы работы основных типов слоёв -- свёртка (convolution), пулинг (pooling), положительная срезка (ReLU)
- Обучение нейронных сетей методами спуска по градиенту
- Вычисление градиента методом автоматического дифференцирования