From 1bcd1170e5054668bbf456d14016cd135087e3bf Mon Sep 17 00:00:00 2001 From: nasrutdinov <47354871+nasrutdinov@users.noreply.github.com> Date: Sun, 10 Mar 2019 19:42:21 +0300 Subject: [PATCH 01/14] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index af7af96..b56ef05 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,5 @@ wiki - https://github.com/nasrutdinov/alg-course/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%BA%D1%83%D1%80%D1%81%D0%B0 +Подготовка к ФЭПО +https://fepo.i-exam.ru/fgos_pim_struct From 32a87d1d384fe69554bf96fe283bb7db590f010d Mon Sep 17 00:00:00 2001 From: marat_nasrutdinov Date: Thu, 28 Mar 2019 13:09:17 +0300 Subject: [PATCH 02/14] =?UTF-8?q?=D0=A7=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BB=D0=BE=D0=B2=D0=B0=D1=80=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 test.py diff --git a/test.py b/test.py new file mode 100644 index 0000000..301abc8 --- /dev/null +++ b/test.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Mar 27 22:38:51 2019 + +@author: marat +""" +s=input() +dic={} +for ch in s: + if s in dic: + dic[ch]+=1 + else: + dic[ch]=1 + +for k in dic: + print(k) From 23a2974be3ac21ee8bcf979edc85429eca11937f Mon Sep 17 00:00:00 2001 From: marat_nasrutdinov Date: Thu, 28 Mar 2019 13:11:22 +0300 Subject: [PATCH 03/14] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BB=D0=BE=D0=B2=D0=B0=D1=80=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test.py b/test.py index 301abc8..d8ca6c0 100644 --- a/test.py +++ b/test.py @@ -12,5 +12,5 @@ else: dic[ch]=1 -for k in dic: - print(k) +for k, val in dic.item(): + print(k, val) From 3a920a2fb2449edfa050f413d3add512603ea992 Mon Sep 17 00:00:00 2001 From: marat_nasrutdinov Date: Mon, 1 Apr 2019 10:20:43 +0300 Subject: [PATCH 04/14] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test.py b/test.py index d8ca6c0..783da51 100644 --- a/test.py +++ b/test.py @@ -2,6 +2,8 @@ """ Created on Wed Mar 27 22:38:51 2019 +additional comment + @author: marat """ s=input() From 84d5e16f65c7d73f9c4aaa09cc305374a38ed465 Mon Sep 17 00:00:00 2001 From: nasrutdinov <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 9 Apr 2019 22:00:53 +0300 Subject: [PATCH 05/14] Update README.md --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index b56ef05..9ff7080 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,21 @@ wiki - https://github.com/nasrutdinov/alg-course/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%BA%D1%83%D1%80%D1%81%D0%B0 +Задачи для зачета *-минимальный набор, [] - необязательная часть + +*Реализовать вычисление чисел Фибоначчи рекурсивным и итеративным способом. [Сравнить время работы, построить график работы в зависимости от номера числа] +*Реализовать "наивное" и быстрое возведение в степень. . [Сравнить время работы, построить график работы в зависимости от степени, в качестве числа взять "большое" целое число] +*Реализовать квадратичные сортировки (вставками, выбора, пузырьком). [Сравнить время работы, построить график работы в зависимости от размера массива, срвнить на упорядоченных в обратную сторону]. +Реализовать быструю сортировку. +Реализовать кодирование Хаффмана. +*Реализовать подсчет частоты встречаемости символов в строке. +Реализовать кучу с помощью массива. +Реализовать кучу через библиотечные классы. +Реализовать кодирование Хаффмана. +*Реализовать нахождение наибольшей возрастающей последовательности . +Задан англо-русский словарь в виде текстового файла: английское слово {пробел} перевод. Сделать русско-английский словарь. Слова отсортировать по алфавиту. +По словарю перевести текст с русского на английский. + Подготовка к ФЭПО https://fepo.i-exam.ru/fgos_pim_struct From cd8794e046d62e05695d39a8324f13b7455b08ad Mon Sep 17 00:00:00 2001 From: nasrutdinov <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 9 Apr 2019 22:01:26 +0300 Subject: [PATCH 06/14] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 9ff7080..d5b1fe4 100644 --- a/README.md +++ b/README.md @@ -6,16 +6,27 @@ wiki - https://github.com/nasrutdinov/alg-course/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D Задачи для зачета *-минимальный набор, [] - необязательная часть *Реализовать вычисление чисел Фибоначчи рекурсивным и итеративным способом. [Сравнить время работы, построить график работы в зависимости от номера числа] + *Реализовать "наивное" и быстрое возведение в степень. . [Сравнить время работы, построить график работы в зависимости от степени, в качестве числа взять "большое" целое число] + *Реализовать квадратичные сортировки (вставками, выбора, пузырьком). [Сравнить время работы, построить график работы в зависимости от размера массива, срвнить на упорядоченных в обратную сторону]. + Реализовать быструю сортировку. + Реализовать кодирование Хаффмана. + *Реализовать подсчет частоты встречаемости символов в строке. + Реализовать кучу с помощью массива. + Реализовать кучу через библиотечные классы. + Реализовать кодирование Хаффмана. + *Реализовать нахождение наибольшей возрастающей последовательности . + Задан англо-русский словарь в виде текстового файла: английское слово {пробел} перевод. Сделать русско-английский словарь. Слова отсортировать по алфавиту. + По словарю перевести текст с русского на английский. From 59410dfc429057025876e8b7843f42d315032367 Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:18:01 +0300 Subject: [PATCH 07/14] Update README.md --- README.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/README.md b/README.md index d5b1fe4..25fa33a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,100 @@ +#АиСД + + +## Программа + + +### 1. Понятие алгоритма. RAM-модель. O-символика. +Приводим пример алгоритма вычисления чисел Фибоначчи. Сравниваем время работы рекурсивной и итеративной версии. Считаем количество операций. Лемма о количестве операций $\geq 2^{n/2}$. Пример сортировки массива методом вставки. Считаем количество операций в наихудшем случае. Квадратичная сортировка. Оценка количества операций сверху. O-символика. Модель памяти. RAM-модель. + + +*Выбираем язык программирования. C++ или Python.* + + +### 2. Сортировки массивов. Сортировка слиянием. +Квадратичные сортировки. Сортировка вставкой, пузырьком и сортировка обменом. Пример сортировки n log(n). Сортировка слиянием. Рекурсивные алгоритмы. Оценка быстродействия. Анализ рекуррентных соотношений. *Теорема об основном методе.* Реализация на C++. **Стратегия разделяй и властвуй.** + + +### 3. Сортировки массивов. Сортировка кучей.  +Структура данных куча. Реализация кучи на массиве. Операции вставки и взятия наименьшего элемента. Сортировка кучей. Оценка быстродействия. Теорема о нижней границе быстродействия алгоритмов сравнения. -Цифровая сортировка. + + +### 4. Сортировки массивов. Быстрая сортировка. +Быстрая сортировка. Оценка быстродействия - худший случай. Подсчет быстродействия рандомизированного алгоритма. Порядковая статистика. Алгоритм Хоара. Реализация на C++. + + +### 5. Динамические структуры данных. Списки. +Алгоритм Хоара для нахождения k-ой порядковой статистики. Динамические структуры. Однонаправленный и двунаправленный список. Реализация на C++. + + +### 6. Структуры данных: стеки очередь. +Структуры данных стек и и очередь. Реализация стека на массиве и списке. Динамическое выделение памяти. Амортизированное время работы. Реализация стека и очереди в C++ (библиотека STL) и Python. **Мало материала** + + +### 7. Хеш-функции. + + +Хеш функции, хеш значения, коллизии, обработка коллизий. Свойства хорошей хеш функции, способы построения хеш функций, примеры. Фильтр Блума. Поиск элементов. Хеш таблицы в стандартной библиотеке C++. Шаблонный класс std::unordered_map. + + + + +### 8. Жадные стратегии +Жадные стратегии. Примеры (stepik). Код Хафмана. + + +### 9. Динамическое программирование. +Динамическое программирование. Вычисление чисел Фибоначчи - реализация, использующая идею динамического программирования. Задача о кузнечике. Наибольшая возрастающая последовательность. Редакторское расстояние (расстояние Левенштейна). + + +1. Вместо исходной задачи решаем множество перекрывающихся (зависимых) задач. Ответы для подзадач сохраняются в таблице. +2. Задача может решаться рекурсивно (программирование сверху вниз) или итеративно (снизу вверх) +3. Часто можно уменьшить размер памяти для хранения таблицы. + + +### 10. Строки. КМП - алгоритм +Алгоритмы работы со строками. Поиск подстроки. Алгоритм Рабина-Карпа. Алгоритм Кнута — Морриса — Пратта. + + +### 11. Динамические структуры данных. Графы. Алгоритмы обхода графов + + +Основные определения теории графов. Приложения, использующие графы как структуры данных. Представление графов в ЭВМ. Алгоритмы обхода графов: поиск в глубину и поиск в ширину. Эйлеров и гамильтонов пути. Поиск компонент связности и бикомпонентов. + + + + +### 12. Графы. Оптимизационные задачи на графах. +Алгоритмы поиска кратчайших путей: алгоритм Флойда и алгоритм Дейкстры. Построение кратчайших остовов: алгоритм Краскала + + +### 13. Графы. Сбалансированные деревья и деревья поиска + + + + +### 14. Параллельное программирование. Обзор-1 +Проблематика распараллеливания. Работа на системах с общей памятью (openMP). Пример задачи Дирихле. + + + ### 15. Параллельное программирование. Обзор-2 +Работа на системах с распределенной памятью (MPI). Пример задачи Дирихле. Видеокарты. MapReduce. + + +### 16. Введение в теорию сложности вычислений. Основные сложностные классы задач +Исторический очерк теории сложности вычислений. Сложностные классы задач. Определение и взаимосвязь классов P и NP. Определение и примеры NP-полных задач. + + +### 17. Резерв. + + +- Элементарные структуры данных и С++ + + Стек (stack), очередь (queue), "дек" (очередь с двумя концами / Deque) и операции над ними. Списки (односвязный, двусвязный), голова и хвост списка. Приоритетная очередь. Поиск в списке, добавление и удаление элементов. Особенности реализации указанных структур данных. Объектно-ориентированное программирование и С++. Классы, шаблоны. Стек как пример контейнера, Динамически выделяемая память, указатели. Выделение и освобождение памяти. Стандартная библиотека шаблонов (STL) – введение. Контейнер std::vector (модель динамического массива). Шаблонные классы std::array, std::list и std::forward_list. Шаблонный класс std::deque и адаптер std::stack. + + + +----------------------------------------------------------- # alg-course материалы к курсу по алгоритмам и структурам данных From 2d4f18b6a1d0caa43355c4288fa3c22cf51aceda Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:31:04 +0300 Subject: [PATCH 08/14] Create tasks.md --- tasks.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 tasks.md diff --git a/tasks.md b/tasks.md new file mode 100644 index 0000000..e6a439b --- /dev/null +++ b/tasks.md @@ -0,0 +1,32 @@ +## Работа с отсортированными массивами + +Даны два отсортированных по неубыванию массива a и b. Определите, есть ли в них одинаковые числа. Время O(n). + +Даны два отсортированных по неубыванию массива a и b. Найдите такие i и j, что разница |a[i] − b[j]| минимальна. Время O(n). + +Даны два отсортированных по неубыванию массива a и b и число S. Найдите такие i и j, что сумма a[i] + b[j] = S. Время O(n). + +Даны два отсортированных по неубыванию массива a и b. Найдите число пар (i, j), таких, что a[i] = b[j]. Время O(n). + +Даны два отсортированных по неубыванию массива a и b. Найдите число пар (i, j), таких, что a[i] > b[j]. Время O(n). + +Дан массива a. Пара (i, j), такая, что i < j и a[i] > a[j] называется инверсией. Пусть в массиве длины n ровно k инверсий. Докажите, что сортировка вставками работает за O(n + k). + +Дан массива a. Найдите число инверсий в нем. Время O(n log n) + +Покажите, что при правильной (какой?) реализации сортировка слиянием является устойчивой (то есть, не меняет порядок равных элементов). + +Реализуйте сортировку слиянием снизу вверх (без рекурсии). + + +********************** + +Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = 2T(n/2 + log n) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = log(n) T(n/ log n) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = 2T(n/2) + n$, то $T(n) = \Omega(n log n)$ (оценка снизу). +Докажите по индукции, что если $T(n) = 2T(\sqrt{n}) + 1$, то $T(n) = O(log n)$. + +*********************** + +Для каждой из приведенных программ и функций оцените время ее работы From d2815c5b12799a2dcb48c7bc6f778fe50427f125 Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:38:55 +0300 Subject: [PATCH 09/14] Update tasks.md --- tasks.md | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/tasks.md b/tasks.md index e6a439b..422f24d 100644 --- a/tasks.md +++ b/tasks.md @@ -10,23 +10,40 @@ Даны два отсортированных по неубыванию массива a и b. Найдите число пар (i, j), таких, что a[i] > b[j]. Время O(n). -Дан массива a. Пара (i, j), такая, что i < j и a[i] > a[j] называется инверсией. Пусть в массиве длины n ровно k инверсий. Докажите, что сортировка вставками работает за O(n + k). +## Рекуррентные соотношения-2 -Дан массива a. Найдите число инверсий в нем. Время O(n log n) +Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n log n)$. -Покажите, что при правильной (какой?) реализации сортировка слиянием является устойчивой (то есть, не меняет порядок равных элементов). +Докажите по индукции, что если $T(n) = 2T(n/2 + log n) + n$, то $T(n) = O(n log n)$. -Реализуйте сортировку слиянием снизу вверх (без рекурсии). +Докажите по индукции, что если $T(n) = log(n) T(n/ log n) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = 2T(n/2) + n$, то $T(n) = \Omega(n log n)$ (оценка снизу). + +Докажите по индукции, что если $T(n) = 2T(\sqrt{n}) + 1$, то $T(n) = O(log n)$. + +## Оценка времени работы + +Для каждой из приведенных программ и функций оцените время ее работы +```c +int func(int n) { + if (n == 0) + return 1; + else + return func(n / 5) + func(n / 5); +} +``` ********************** -Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n log n)$. -Докажите по индукции, что если $T(n) = 2T(n/2 + log n) + n$, то $T(n) = O(n log n)$. -Докажите по индукции, что если $T(n) = log(n) T(n/ log n) + n$, то $T(n) = O(n log n)$. -Докажите по индукции, что если $T(n) = 2T(n/2) + n$, то $T(n) = \Omega(n log n)$ (оценка снизу). -Докажите по индукции, что если $T(n) = 2T(\sqrt{n}) + 1$, то $T(n) = O(log n)$. +Дан массива a. Пара (i, j), такая, что i < j и a[i] > a[j] называется инверсией. Пусть в массиве длины n ровно k инверсий. Докажите, что сортировка вставками работает за O(n + k). + +Дан массива a. Найдите число инверсий в нем. Время O(n log n) + +Покажите, что при правильной (какой?) реализации сортировка слиянием является устойчивой (то есть, не меняет порядок равных элементов). + +Реализуйте сортировку слиянием снизу вверх (без рекурсии). *********************** -Для каждой из приведенных программ и функций оцените время ее работы + From bb3317380eb0a9a260f5a5d2ecbad43263fc0740 Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:39:50 +0300 Subject: [PATCH 10/14] Update tasks.md --- tasks.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tasks.md b/tasks.md index 422f24d..5c38565 100644 --- a/tasks.md +++ b/tasks.md @@ -34,6 +34,15 @@ int func(int n) { } ``` +```c +int func2(int n) { + if (n == 0) + return 1; + else + return 2*func2(n / 5); +} +``` + ********************** Дан массива a. Пара (i, j), такая, что i < j и a[i] > a[j] называется инверсией. Пусть в массиве длины n ровно k инверсий. Докажите, что сортировка вставками работает за O(n + k). From 10a138da38dc591f8e121e58d8f8a098ba36fc5e Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:44:11 +0300 Subject: [PATCH 11/14] Update tasks.md --- tasks.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks.md b/tasks.md index 5c38565..f0a543e 100644 --- a/tasks.md +++ b/tasks.md @@ -1,3 +1,5 @@ +**Источник** https://neerc.ifmo.ru/teaching/algo/year2022/index.html + ## Работа с отсортированными массивами Даны два отсортированных по неубыванию массива a и b. Определите, есть ли в них одинаковые числа. Время O(n). From 5c018808ee814ede38febf3c5d7ab0a8332d2984 Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:56:49 +0300 Subject: [PATCH 12/14] Update tasks.md --- tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.md b/tasks.md index f0a543e..ec41dc7 100644 --- a/tasks.md +++ b/tasks.md @@ -14,7 +14,7 @@ ## Рекуррентные соотношения-2 -Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n \log n)$. Докажите по индукции, что если $T(n) = 2T(n/2 + log n) + n$, то $T(n) = O(n log n)$. From d8decde32b569bc8d73975d6d4ee85efb04a7ffb Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:00:28 +0300 Subject: [PATCH 13/14] Update tasks.md --- tasks.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tasks.md b/tasks.md index ec41dc7..04563d5 100644 --- a/tasks.md +++ b/tasks.md @@ -14,15 +14,15 @@ ## Рекуррентные соотношения-2 -Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n \log n)$. +Докажите по индукции, что если $T(n) = 2T(n/2 + 20) + n$, то $T(n) = O(n \cdot \log{ }n)$. -Докажите по индукции, что если $T(n) = 2T(n/2 + log n) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = 2T(n/2 + \log{ } n) + n$, то $T(n) = O(n \cdot \log{ } n)$. -Докажите по индукции, что если $T(n) = log(n) T(n/ log n) + n$, то $T(n) = O(n log n)$. +Докажите по индукции, что если $T(n) = \log(n) T(n/ \log{ } n) + n$, то $T(n) = O(n \cdot \log{ } n)$. -Докажите по индукции, что если $T(n) = 2T(n/2) + n$, то $T(n) = \Omega(n log n)$ (оценка снизу). +Докажите по индукции, что если $T(n) = 2T(n/2) + n$, то $T(n) = \Omega(n \cdot \log{ } n)$ (оценка снизу). -Докажите по индукции, что если $T(n) = 2T(\sqrt{n}) + 1$, то $T(n) = O(log n)$. +Докажите по индукции, что если $T(n) = 2T(\sqrt n) + 1$, то $T(n) = O(\log{ } n)$. ## Оценка времени работы From f90fcea018d022c31a36161d2dda9be4878e71b3 Mon Sep 17 00:00:00 2001 From: marat <47354871+nasrutdinov@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:02:57 +0300 Subject: [PATCH 14/14] Update tasks.md --- tasks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.md b/tasks.md index 04563d5..2442a48 100644 --- a/tasks.md +++ b/tasks.md @@ -1,4 +1,4 @@ -**Источник** https://neerc.ifmo.ru/teaching/algo/year2022/index.html +**Источник** [ИТМО](https://neerc.ifmo.ru/teaching/) ## Работа с отсортированными массивами