Similar presentations:
Функция. Оценка сложности алгоритмов. Алгоритмы сортировки
1.
2 семестр2.
Вводим новую систему оценивания• 3 оценки: 5, точка и 2
• Набрал 3 точки => получилась одна двойка
• Невыполнение дз или не успевание сделать n-ое количество
задач на паре превращаются в точку
• За опоздания точка
3.
Для началаЧто такое функция?
4.
Функция:• фрагмент программного кода, к которому можно обратиться из
другого места программы
• Функцией называется соответствие между двумя множествами,
при котором каждому элементу одного множества соответствует
единственный элемент другого множества.
5.
Оценка сложностиалгоритма
time complexity
space complexity
6.
Критерии оценки алгоритма• Вычислительная временная сложность (time complexity) — это
максимальное возможное количество выполненных алгоритмом
элементарных операций, как функция от размера входных
данных.
• Вычислительная ёмкостная сложность (space complexity) — это
максимальный возможный размер занятой алгоритмом
дополнительной памяти, как функция от размера входных
данных.
7.
Примерfor (int i=0; i < n; i++)
count++;
Посчитаем количество элементарных операций:
Для i = 0
Для i < n
Для i++
Для count++
8.
Примерfor (int i=0; i < n; i++)
count++;
Посчитаем количество элементарных операций:
Для i = 0
=> 1
Для i < n
=> n + 1
Для i++ => (i=i+1) => 2n
Для count++ => (count=count+1) => 2n
9.
Итого:for (int i=0; i < n; i++)
count++;
Получаем временную сложность алгоритма:
10.
Пример:11.
Итого• Посчитаем функцию сложности:
• i = 0 выполнится лишь однажды
• i<n внутри while выполнится n+1 раз
• i+=1 выполнится n раз (+= это две элементарные операции)
• цикл for начнет выполняться n раз и каждый раз:
• j=0 выполнится один раз
• j<n выполнится n+1 раз
• j++ выполнится n раз (++ это две элементарные операции)
• count++ выполнится n раз (++ это две элементарные операции)
12.
Итого, сложность13.
Асимптотическая оценка инотация большого О
Асимптотическая оценка даёт нам
примерное представление, при
каком размере задачи (того самого
n, от которого зависит функция
сложности), можно ожидать
приемлемой скорости выполнения.
14.
ПримерыО – степень
сложности не более
числа n
Ѳ – степень
сложности в
точности число n
15.
ПримерКакая операция
выполняется
больше всего раз?
16.
17.
Красная зона –> ожидание результата неменее суток
18.
https://ulearn.me/19.
РекурсияРекурсия — это функция, которая
вызывает саму себя.
Понятие функция используется в
рамках информатики.
20.
Пример21.
ПримерВ чем
проблема?
22.
23.
Итог:1)Условие для не рекурсивного возврата ( условие остановки)
2)Рекурсивный возврат
24.
Пример25.
Пример с несколькими условиями26.
Чем больше тем лучше, минимум 527.
ДЗ => задача соответствует номеру всписке
28.
Поиск в массивеЛинейный и бинарный поиск
29.
int required_number = 4;int * mas = new int[n];
for (int i = 0; i < n; i++)
{
if (mas[n] == required_number)
{
std::cout << i;
break;
}
Что делает этот код и
какая у него временная
сложность?
30.
Бинарный поиск• Поиск осуществляется только в отсортированном массиве
• Работает на порядок быстрее, чем линейный поиск
31.
32.
33.
34.
35.
Источники• https://brestprog.by/topics/binsearch/
• https://codelessons.dev/ru/binarnyj-poisk-po-massivu-c/
36.
Алгоритмы сортировки• Простые сортировки
• Эффективные
сортировки
37.
38.
Простые сортировки39.
Сортировка пузырькомЗдесь нужно последовательно сравнивать значения соседних
элементов и менять числа местами, если предыдущее
оказывается больше последующего. Таким образом
элементы с большими значениями оказываются в конце
списка, а с меньшими остаются в начале.
40.
Код. Разборvoid BubbleSort(int* array, int array_size) {
for (int idx_i = 0; idx_i + 1 < array_size; idx_i++) {
for (int idx_j = 0; idx_j + 1 < array_size - idx_i; idx_j++) {
if (array[idx_j + 1] < array[idx_j]) {
swap(array[idx_j], array[idx_j + 1]);
}
}
}
}
41.
Сортировка вставкамиПри сортировке вставками массив
постепенно перебирается слева направо.
При этом каждый последующий элемент
размещается так, чтобы он оказался между
ближайшими элементами с минимальным и
максимальным значением.
42.
Код. Разборvoid InsertionSort(int* array, int num_of_elm) {
for (int i = 1; i < num_of_elm; i++) {
int current_num = array[i];
int j = i;
while (j > 0 && array[j - 1] > current_num) {
array[j] = array[j - 1];
--j;
}
array[j] = current_num;
}
}
43.
Сортировка выборомСначала нужно рассмотреть подмножество массива и
найти в нём максимум (или минимум). Затем
выбранное значение меняют местами со значением
первого неотсортированного элемента. Этот шаг нужно
повторять до тех пор, пока в массиве не закончатся
неотсортированные подмассивы.
44.
Код. Разбор• void SelectionSort(vector<int>& values) {
• for (auto i = values.begin(); i != values.end(); ++i) {
• auto j = std::min_element(i, values.end());
• swap(*i, *j);
• }
•}
45.
Задачи46.
Эффективные сортировки47.
Быстрая сортировкаЭтот алгоритм состоит из трёх шагов.
1. Сначала из массива нужно выбрать один
элемент — его обычно называют опорным.
2. Затем другие элементы в массиве
перераспределяют так, чтобы элементы меньше
опорного оказались до него, а большие или
равные — после.
3. А дальше рекурсивно применяют первые два
шага к подмассивам справа и слева от опорного
значения.
48.
Сортировки слияниемСортировка слиянием пригодится для таких
структур данных, в которых доступ к элементам
осуществляется последовательно (например, для
потоков). Здесь массив разбивается на две
примерно равные части и каждая из них
сортируется по отдельности. Затем два
отсортированных подмассива сливаются в один.
49.
Пирамидальная сортировкаПри этой сортировке сначала строится пирамида из
элементов исходного массива. Пирамида (или
двоичная куча) — это способ представления
элементов, при котором от каждого узла может
отходить не больше двух ответвлений. А значение в
родительском узле должно быть больше значений в
его двух дочерних узлах.
50.
Задачи51.
Источникиhttps://habr.com/ru/articles/188010/
https://education.yandex.ru/journal/osnovnye-vidy-sortirovok-i-primery-ikh-realizatsii
52.
Type struct and vector53.
Vector• Вектор представляет контейнер, который содержит
коллекцию объектов одного типа.
• #include <vector>
• Вектор является динамическим одномерным массивом.
54.
Базовые операции с объектами классаvector
55.
Решаем задачку на массивы через вектор56.
5 Задачек из Полякова используя vector57.
Источники• https://metanit.com/cpp/tutorial/7.2.php
• https://learn.microsoft.com/ru-ru/cpp/standard-library/vectorclass?view=msvc-170
58.
Struct• Собственный тип данных
• Чтобы определить структуру необходимо:
struct имя_структуры
{
компоненты_структуры
};
59.
Возникает понятие экземпляр60.
Примеры.• 1. Объект: Смартфон.
Характеристики объекта: Фирма-производитель, объем
встроенной памяти, цена.
• 2. Объект: Ноутбук.
Характеристики объекта: Фирма-производитель, модель
процессора, наличие игровой видеокарты.
• 3. Объект: Электронная книга.
Характеристики объекта: Фирма-производитель, размер экрана,
наличие подсветки экрана.
• 4. Объект: Монитор.
Характеристики объекта: Фирма-производитель, размер экрана,
цена.
61.
Задание1. Создать по 2 экземпляра структуры
2. Создать функцию ввода параметром принимать указатель на
структуру.
3. Создать функцию вывода, которая печатает сведения о
экземпляре структуры.
4. Функция, которая создает динамически экземпляры структуры,
сохраняет их в вектор.
62.
Потоки ввода вывода• istream и wistream: читают данные с
потока
• ostream и wostream: записывают
данные в поток
• iostream и wiostream: читают и
записывают данные в поток
63.
Поток выводаСтандартные объекты: std::cout <<; std::cerr << ;
Два операнда << левый показывает, куда осуществляется
вывод, правый что выводится.
64.
Поток вводаСтандартный объект: std::cin >> ;
Также два операнда >> левый показывает откуда осуществляется
ввод, правый куда записывать
65.
Работа с файлами66.
Открытие и закрытие файлов• std::ofstream out;
// поток для записи
• out.open("hello1.txt"); // окрываем файл для записи
• std::ifstream in;
// поток для чтения
• in.open("hello4.txt"); // окрываем файл для чтения
• std::fstream fs;
// поток для чтения-записи
• fs.open("hello5.txt"); // окрываем файл для чтения-записи
67.
Чтение и запись файлов68.
Чтение и запись файлов69.
Задание• Создать файл, сделать запись в файл, и считать из файла
70.
КР. Указатели и массивы1. Что такое указатель?
2. Что такое массив?
3. Как массивы хранятся в памяти компьютера?
4. Напишите определение структуры “Человек”, с характеристиками: пол,
возраст, страна рождения. Определите 1 экземпляр этой структуры.
5. Укажите временную сложность алгоритмов
6. Создайте динамический массив целого типа состоящий из 5 элементов
на языке C/C++.
71.
72.
с73.
Списки• Что такое списки?
• Отличие от массивов
74.
Список75.
Проблема массивов• Добавление нового элемента. При добавлении элемента в
массив, создается массив большего размера, затем элементы
старого массива перезаписываются в новый, затем добавляется
новый элемент. Временная сложность записи O(n). Сложность по
памяти n + n + k, где n – размер старого массива, k – кол-во
добавленных элементов.
76.
Отличие списка от массиваМассив
1. Элементы массива хранятся в
памяти друг за другом.
2. Для создания массива, мы
должны заранее знать
количество элементов.
3. Для добавления нового элемента
нужно выделить новый массив.
4. Чтобы обратиться к любому
элементу, достаточно указать его
индекс.
Список
1. Элементы списка хранятся в
памяти независимо друг от
друга
2. Для создания списка
достаточно создать указатель.
3. Для добавления элемента,
нужно выделить память только
под сам элемент.
4. Чтобы обратиться к элементу
нужно найти адрес этого
элемента через цикл.
77.
Списки78.
А теперь… Презентации из НГТУ79.
Решаем задачу без смс и регистрации80.
Источники• https://metanit.com/cpp/tutorial/7.6.php
• https://metanit.com/cpp/tutorial/7.7.php
• Презентации из НГТУ
81.
Задание на 2 пары• Реализовать очередь и стек на массивах и на
списках
• Должны быть реализованы операции:
• Добавления элемента О(1)
• Извлечение элемента О(1)
• Использовать структуры шаблонного типа при
реализции
82.
83.
Отчет• Текст программы
• Результат сравнения скоростей добавления, извлечения…
84.
Второе задание• Создать отображение: буквы на отрицательное
целое число, используя массив
• Реализовать операции:
• добавления соответствия О(1)
• удаление соответствия О(1)
85.
Очереди и стеки86.
Деревья87.
Heap (Куча)88.
Графы89.
1. Сложность алгосов (временная и пространственная)2. Рекурсия
3. Алгоритмы поиска в массиве: линейный и бинарный отличия –>
переход к сортировкам
4. Сортировки: пузырек и квадратичные сортировки (выбор типа
сортировки)
5. Быстрая сортировка и сортировка слиянием
6. Пирамидальная сортировка и сортировка вставками
90.
7. Списки (односвязный, двусвязный) теория + пример8. Односвязный список практика
9. Стек, очередь, дек, теория + пример
10. Стек, очередь, дек практика
11. Деревья теория + пример (2-3)
12. Деревья практика (2-3)
13. Графы теория
14. Графы обход в глубину
15. Графы обход в ширину
16. Графы алгоритм дейкстры