Вычислительная сложность. Базовые структуры данных и их использование в С++

Содержание

Слайд 2

Основные пункты

Вычислительная сложность
Базовые структуры данных и их использование в С++

Основные пункты Вычислительная сложность Базовые структуры данных и их использование в С++

Слайд 3

Вычислительная сложность

Нужно как-то сравнивать ресурсы, которые будут потрачены тем или иным алгоритмом
Они

Вычислительная сложность Нужно как-то сравнивать ресурсы, которые будут потрачены тем или иным
включают:
Время процессора
Занимаемая память

Слайд 4

Вычислительная сложность

Вариант #1 – точный подсчет, например, отдельных команд процессора
Проблемы:
Команды занимают разное

Вычислительная сложность Вариант #1 – точный подсчет, например, отдельных команд процессора Проблемы:
время
У разных процессоров разные наборы команд
Громоздкость выражений и сложность подсчета

Слайд 5

Вычислительная сложность

Как правило, достаточно сравнивать поведение алгоритмов в целом
Вариант #2 – сравнивать

Вычислительная сложность Как правило, достаточно сравнивать поведение алгоритмов в целом Вариант #2
общий вид зависимости использованного времени/памяти от входных данных

Слайд 6

«О» большое

 

«О» большое

Слайд 7

«О» большое

Объяснение на примерах:
мы говорим, что алгоритм имеет сложность O(n) операций,

«О» большое Объяснение на примерах: мы говорим, что алгоритм имеет сложность O(n)
если с ростом размера входных данных затрачиваемое время/ресурсы растут линейно

Слайд 8

«О» большое

O(n): n = 10, операций 10 n = 20, операций 20
Но так же

«О» большое O(n): n = 10, операций 10 n = 20, операций
под О(n) подходит: n = 1, операций 103 n = 2, операций 206 n = 1000, операций 112 910 главное – что в целом растет линейно

Слайд 9

«О» большое

Мы говорим, что алгоритм имеет сложность O(n^2) операций, если с ростом

«О» большое Мы говорим, что алгоритм имеет сложность O(n^2) операций, если с
размера входных данных затрачиваемое время/ресурсы растут квадратично. n = 10, операций около 100 n = 20, операций около 400

Слайд 10

«О» большое

Часто можно увидеть:
O(1)
O(log n)
O(sqrt n)
O(n)
O(n * log n)
O(n ^ 2)
O(2 ^

«О» большое Часто можно увидеть: O(1) O(log n) O(sqrt n) O(n) O(n
n)

Слайд 11

«О» большое

Что такое n? Примеры:
Определение простоты числа n: n – само число
Сортировка

«О» большое Что такое n? Примеры: Определение простоты числа n: n –
массива: n – размер массива
Работа со строкой: n – размер строки

Слайд 12

Базовые структуры данных

Массив
Вектор
Множество
Стек
Очередь
Словарь

Базовые структуры данных Массив Вектор Множество Стек Очередь Словарь

Слайд 13

Массив

Последовательность элементов фиксированного размера.
Операции:
Получить элемент по индексу: О(1) времени
Записать элемент по индексу:

Массив Последовательность элементов фиксированного размера. Операции: Получить элемент по индексу: О(1) времени
O(1) времени

Слайд 14

Массив в С++

int arr[100];
arr[0] = 123; // записали элемент
cout << arr[0]; //

Массив в С++ int arr[100]; arr[0] = 123; // записали элемент cout
получили элемент ---------------------------------------------------------------- int *arr = new int[100]; arr[0] = 123; delete[] arr;

Слайд 15

STL

STL (Standard Template Library) – набор алгоритмов, контейнеров и вспомогательных функций в

STL STL (Standard Template Library) – набор алгоритмов, контейнеров и вспомогательных функций
языке С++.
Контейнеры – объекты для хранения данных. В виде них в C++ уже реализованы все базовые стуктуры.
Далее – общий обзор основных из этих стуктур.

Слайд 16

Вектор

Массив имеет фиксированный размер, что не всегда удобно в практических ситуациях.
Операции:
Получить элемент

Вектор Массив имеет фиксированный размер, что не всегда удобно в практических ситуациях.
по индексу: О(1) времени
Записать элемент по индексу: O(1)
Получить текущий размер вектора: O(1)
Добавить элемент в конец вектора: О(1)*

Слайд 17

Вектор в С++

#include
vector tmp;
tmp.push_back(1);
tmp.push_back(2); tmp.push_back(3); cout << tmp [0] << tmp[1] << tmp[2];

Вектор в С++ #include vector tmp; tmp.push_back(1); tmp.push_back(2); tmp.push_back(3); cout В угловых
// 1 2 3

В угловых скобках <> указан
тип данных, которые будут
храниться в векторе

Индексация с 0, обращение как и к массиву

Слайд 18

Вектор в С++

vector numbers; cin >> n; for (int i = 0; i <

Вектор в С++ vector numbers; cin >> n; for (int i =
n; i++) { int tmp; cin >> tmp; numbers.push_back(tmp); }

Добавляем элемент в конец

Слайд 19

Вектор в С++

vector numbers; // …
for (int i = 0; i < number.size();

Вектор в С++ vector numbers; // … for (int i = 0;
i++) { cout << numbers[i] << endl;
}

Количество элементов
на данный момент

Слайд 20

Множество

Структура данных, в которой каждый элемент хранится в единственном числе.
Операции:
Добавить элемент в

Множество Структура данных, в которой каждый элемент хранится в единственном числе. Операции:
множество
Удалить элемент из множества
Проверить наличие элемента во множестве
Получить размер множества

Слайд 21

Множество в С++

В С++ существует две реализации множества – set и unordered_set.

Множество в С++ В С++ существует две реализации множества – set и
Пока остановимся только на первой.
Занимаемая память – O(n log n)
Добавление элемента – O(log n)
Удаление элемента – О(log n)
Проверка элемента – O(log n)

Слайд 22

Множество в С++

#include
set my_set;
my_set.insert(3);
my_set.insert(4);
my_set.insert(3);
cout << my_set.size(); // 2

В множестве два элемента:
числа

Множество в С++ #include set my_set; my_set.insert(3); my_set.insert(4); my_set.insert(3); cout В множестве
3 и 4

Слайд 23

Множество в С++

set my_set;
my_set.insert(1);
my_set.insert(2);
my_set.erase(1);
my_set.erase(2);
cout << my_set.size(); // 0

Удалили все элементы

Множество в С++ set my_set; my_set.insert(1); my_set.insert(2); my_set.erase(1); my_set.erase(2); cout Удалили все элементы

Слайд 24

Множество в С++

set my_set;
// Определим, есть ли там элемент 2
if (my_set.find(2) !=

Множество в С++ set my_set; // Определим, есть ли там элемент 2
my_set.end())
{
cout << "Element 2 exists!";
}

Слайд 25

Множество в С++

set my_set;
// Вывести все элементы множества
for (auto it = my_set.begin();

Множество в С++ set my_set; // Вывести все элементы множества for (auto
it != my_set.end();
it++)
{
cout << *it << endl;
}

Это итераторы, их разберем
не сегодня

Слайд 26

Стек

Структура данных «LIFO» (Last-In First-Out).
Операции:
Добавить элемент на вершину стека: O(1)
Получить элемент с

Стек Структура данных «LIFO» (Last-In First-Out). Операции: Добавить элемент на вершину стека:
вершины стека: O(1)
Удалить элемент с вершины стека: O(1)
Определить, не пустой ли стек: O(1)

Слайд 27

Стек

Названия операций:
Добавить элемент: push
Получить элемент на вершине: top
Удалить элемент с вершины: pop
Проверить

Стек Названия операций: Добавить элемент: push Получить элемент на вершине: top Удалить
на пустоту: empty

Слайд 28

Стек в С++

stack s;
s.push(1);
s.push(2);
s.push(3);
while (!s.empty())
{
cout << s.top() << " "; //

Стек в С++ stack s; s.push(1); s.push(2); s.push(3); while (!s.empty()) { cout
3 2 1
s.pop();
}

1

2

3

Тут вершина

Берем с вершины

Кладем на
вершину

Слайд 29

Очередь

Структура данных «FIFO» (First-In First-Out).
Операции:
Добавить элемент в конец очереди: O(1)
Получить элемент с

Очередь Структура данных «FIFO» (First-In First-Out). Операции: Добавить элемент в конец очереди:
начала очереди: O(1)
Удалить элемент с начала очереди: O(1)
Определить, не пуста ли очередь: O(1)

Слайд 30

Очередь

Названия операций:
Добавить элемент в конец: push
Получить элемент в начале: front
Удалить элемент в

Очередь Названия операций: Добавить элемент в конец: push Получить элемент в начале:
начале: pop
Проверить на пустоту: empty

Слайд 31

Стек | Очередь

Стек | Очередь

Слайд 32

Очередь в С++

queue q;
q.push(1);
q.push(2);
q.push(3);
while (!q.empty())
{
cout << q.front() << " "; //

Очередь в С++ queue q; q.push(1); q.push(2); q.push(3); while (!q.empty()) { cout
1 2 3
q.pop();
}

1

2

3

Начало

Конец

Берем из начала

Слайд 33

Словарь

Структура данных, в которой можно сохранять и получать значения по произвольным ключам
Операции:
Записать

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

Слайд 34

Словарь в С++ (map)

Занимаемая память: O(n log n)
Сложность операций:
Получить значение по ключу:

Словарь в С++ (map) Занимаемая память: O(n log n) Сложность операций: Получить
O(log n)
Записать значение по ключу: O(log n)
Проверить наличие ключа: O(log n)
Получить размер словаря: O(1)

Слайд 35

Словарь в С++ (map)

#include
map my_map;
my_map['A'] = 5;
my_map['B'] = 6;
cout <<

Словарь в С++ (map) #include map my_map; my_map['A'] = 5; my_map['B'] =
"A is " << my_map['A'];

<тип ключа, тип значения>

Обращаемся как к массиву

Слайд 36

Словарь в С++ (map)

#include
map my_map;
my_map['A'] = 5;
if (my_map.find('A') != my_map.end())
{

Словарь в С++ (map) #include map my_map; my_map['A'] = 5; if (my_map.find('A')
cout << "Key 'A' exists!";
}

<тип ключа, тип значения>