66
Алгоритмы и структуры данных Лекция 1. Введение в алгоритмы. (с) Глухих Михаил Игоревич, [email protected]

Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Алгоритмы иструктуры данных

Лекция 1. Введение в алгоритмы.

(с) Глухих Михаил Игоревич, [email protected]

Page 2: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Цель курса

• Познакомиться с основами анализа и оценкиэффективности алгоритмов (структур)

2

Page 3: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Цель курса

• Познакомиться с основами анализа и оценкиэффективности алгоритмов (структур)

• Познакомиться с основными группами известныхалгоритмов (структур)

3

Page 4: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Цель курса

• Познакомиться с основами анализа и оценкиэффективности алгоритмов (структур)

• Познакомиться с основными группами известныхалгоритмов (структур)

• Научиться применять известные алгоритмы (структуры) при программировании на известном языкепрограммирования (Java или C++)

4

Page 5: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Цель курса

• Познакомиться с основами анализа и оценкиэффективности алгоритмов (структур)

• Познакомиться с основными группами известныхалгоритмов (структур)

• Научиться применять известные алгоритмы (структуры) при программировании на известном языкепрограммирования (Java или C++)

• Научиться конструировать новые алгоритмы, применяяуже известные идеи

5

Page 6: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Квалификация программиста = ?

Разработка

Предельный объём + сложность программы

6

Page 7: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Квалификация программиста = ?

Разработка

Предельный объём + сложность программы

Качество кода

Читаемость

Надёжность

Производительность

7

Page 8: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Квалификация программиста = ?

Разработка

Предельный объём + сложность программы

Качество кода

Читаемость

Надёжность

Производительность

Знания

Языки + Библиотеки

Приёмы разработки

8

Page 9: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Квалификация программиста = ?

Разработка

Предельный объём + сложность программы

Качество кода

Читаемость

Надёжность

Производительность

Знания

Языки + Библиотеки

Приёмы разработки

Анализ

Умение разобраться в сложном коде / задаче

9

Page 10: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Литература

Томас Кормен и др. Алгоритмы. Построение и анализ. 3-еиздание

Никлаус Вирт. Алгоритмы + Структуры данных = Программы

Е. В. Пышкин. Структуры данных и алгоритмы: реализация наC++ (ссылка на странице курса)

McDowell, G. L. Cracking the Coding Interview: 150 Programming Questions and Solutions

S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani. Algorithms

https://github.com/Kotlin-Polytech/JavaKotlinASD

10

Page 11: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Must have!© Cracking the Coding Interview

Data structures

Linked Lists

Binary Trees

Tries

Stacks / Queues

Array Lists

Hash Tables

11

Page 12: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Must have!© Cracking the Coding Interview

Algorithms

Breadth-First Search

Depth-First Search

Binary Search

Merge Sort

Quick Sort

Tree Insert / Find / …

12

Page 13: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Must have!© Cracking the Coding Interview

Concepts

Bit manipulation

Singleton design pattern

Factory design pattern

Memory (Stack / Heap)

Recursion

Big O

13

Page 14: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Краткое содержание курса(основы)

Алгоритмы: Big O, рекуррентность, декомпозиция

Алгоритмы сортировки

Графовые алгоритмы

Структуры данных: бинарные и префиксные деревья

Структуры данных: хэш-таблицы

14

Page 15: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Краткое содержание курса(дополнения) Динамическое программирование

Эвристические алгоритмы

Вероятностные алгоритмы

Алгоритмы шифрации

Алгоритмы сжатия данных

Управление памятью

Data Mining

NP-полнота

15

Page 16: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Многообразие задач

Интернет

Оптимальные маршруты перемещения данных

Поиск страниц с нужной информацией

16

Page 17: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Многообразие задач

Интернет

Оптимальные маршруты перемещения данных

Поиск страниц с нужной информацией

Электронная коммерция

Шифрование с открытым ключом

Цифровая подпись

17

Page 18: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Многообразие задач

Интернет

Оптимальные маршруты перемещения данных

Поиск страниц с нужной информацией

Электронная коммерция

Шифрование с открытым ключом

Цифровая подпись

Производство / коммерция

Оптимизация выгоды в условиях различных ограничений

18

Page 19: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Многообразие алгоритмов

Поиск кратчайшего пути и задача коммивояжёра

Поиск длиннейшей общей подпоследовательности

Поиск зависимостей между модулями проекта

Преобразование Фурье

Умножение матриц

Случайная перестановка элементов

Составление расписаний

Игра в шахматы

Распараллеливание

19

Page 20: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Результат семестра: оценка за проекты + зачёт Два из Трёх

Индивидуальный проект

Соревновательный проект

Теория (решение набора относительно простых задач)

Средняя оценка из двух лучших:

4.5…5 – «отлично» + «зачёт»

4…4.49 – «хорошо» + «зачёт»

3.5…3.99 – «хорошо» + собеседование по теории

3…3.49 – «удовлетворительно» + собеседование по теории

20

Page 21: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Структуры и алгоритмы

Структура = данные с определённой организацией

Иногда включающие наборы «Инвариантов»

Пример: сбалансированное бинарное дерево

21

Page 22: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Структуры и алгоритмы

Структура = данные с определённой организацией

Иногда включающие наборы «Инвариантов»

Пример: сбалансированное бинарное дерево

Алгоритм = формальная операция над данными

(с определённой организацией)

Предусловия / постусловия

Сохранение инвариантов

22

Page 23: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Пример алгоритма: сортировка

Input = List<Comparable> in

Output = List<Comparable> out

Invariant = None

Precondition = None

Postcondition = for any i: out[i+1] >= out[i]

23

Page 24: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Корректность алгоритма

Output = Alg(Input)

Математически

ЕСЛИ Precondition(Input), ТО Postcondition(Alg(Input))

ЕСЛИ Invariant(Input), ТО Invariant(Alg(Input))

Как доказать корректность?

24

Page 25: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Пример: сортировка вставками

Код на Java в примере lesson1.Sorts

Псевдокод

for j = 1 to list.size – 1:key = list[j] i = j – 1 while i >= 0 && list[i] > key:

list[i+1] = list[i] i--

list[i+1] = key

25

Page 26: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка вставками: принцип рекуррентности

Рекуррентный (индуктивный) алгоритм

База: 1 элемент всегда упорядочен

26

Page 27: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка вставками: принцип рекуррентности

Рекуррентный (индуктивный) алгоритм

База: 1 элемент всегда упорядочен

Переход: от j-1 упорядочены к j упорядочены

Пусть j-1 элементов уже упорядочено

Берём элемент номер j

Находим среди j-1 элементов такую пару A[i] и A[i+1], что A[i] <= A[j] <= A[i+1];либо, если её нет, то одно из двух: A[j] <= A[0] или A[j-1] <= A[j]

Вставляем элемент номер j между этой парой

27

Page 28: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка вставками: принцип рекуррентности Рекуррентный (индуктивный) алгоритм

База: 1 элемент всегда упорядочен

Переход: от j-1 упорядочены к j упорядочены

Пусть j-1 элементов уже упорядочено

Берём элемент номер j

Находим среди j-1 элементов такую пару A[i] и A[i+1], что A[i] <= A[j] <= A[i+1];либо, если её нет, то одно из двух: A[j] <= A[0] или A[j-1] <= A[j]

Вставляем элемент номер j между этой парой

Результат: все N элементов упорядочены

28

Page 29: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка вставками: O(?)

Пусть размер списка Nfor j = 1 to list.size – 1:

key = list[j] i = j – 1 while i >= 0 && list[i] > key:

list[i+1] = list[i] i--

list[i+1] = key

29

Page 30: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка вставками: O(?)

Пусть размер списка Nfor j = 1 to list.size – 1: // N-1

key = list[j] // N-1i = j – 1 // N-1while i >= 0 && list[i] > key: // N-1

list[i+1] = list[i] // 0..N(N-1)/2i--

list[i+1] = key // N-1

30

Page 31: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка вставками: O(?)

Пусть размер списка Nfor j = 1 to list.size – 1: // N-1

key = list[j] // N-1i = j – 1 // N-1while i >= 0 && list[i] > key: // N-1

list[i+1] = list[i] // 0..N(N-1)/2i--

list[i+1] = key // N-1

5(N-1) … 5(N-1) + N(N-1)/2

31

Page 32: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Затраты времени

В наихудшем случае (обычно важнее всего)

32

Page 33: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Затраты времени

В наихудшем случае (обычно важнее всего)

В среднем случае (важно, если наихудший случайпроисходит крайне редко)

33

Page 34: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Затраты времени

В наихудшем случае (обычно важнее всего)

В среднем случае (важно, если наихудший случайпроисходит крайне редко)

В наилучшем случае (как правило, неважно)

34

Page 35: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Затраты времени

В наихудшем случае (обычно важнее всего)

В среднем случае (важно, если наихудший случайпроисходит крайне редко)

В наилучшем случае (как правило, неважно)

Каковы наилучший и наихудший случайдля сортировки вставками?

35

Page 36: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Затраты времени

В наихудшем случае (обычно важнее всего)

В среднем случае (важно, если наихудший случайпроисходит крайне редко)

В наилучшем случае (как правило, неважно)

Каковы наилучший и наихудший случайдля сортировки вставками?

Как разработать алгоритм с минимальными затратами внаилучшем случае?

36

Page 37: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Интересные вопросы про O(f(n))

Что это такое?

37

Page 38: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Интересные вопросы про O(f(n))

Что это такое?

Верно ли, что:

O(n)+O(n)=2*O(n)

O(n)+O(n)=O(2*n)

O(n)+O(n)=O(n)

38

Page 39: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Интересные вопросы про O(f(n))

Что это такое?

Верно ли, что:

O(n)+O(n)=2*O(n)

O(n)+O(n)=O(2*n)

O(n)+O(n)=O(n)

O(n)*O(n)=O2(n)

O(n)*O(n)=O(n2)

O(n)*O(n)=O(n)

39

Page 40: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Математика: варианты оценки затрат

f(n) = O(g(n)): существуют C и n0: при n>n0 f(n) < Cg(n)

ОЦЕНКА СВЕРХУ ~ РАСТЁТ МЕДЛЕННЕЕ

40

Page 41: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Математика: варианты оценки затрат

f(n) = O(g(n)): существуют C и n0: при n>n0 f(n) < Cg(n)

ОЦЕНКА СВЕРХУ ~ РАСТЁТ МЕДЛЕННЕЕ

f(n) = Ω(g(n)): существуют C и n0: при n>n0 f(n) > Cg(n)

ОЦЕНКА СНИЗУ ~ РАСТЁТ БЫСТРЕЕ

41

Page 42: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Математика: варианты оценки затрат

f(n) = O(g(n)): существуют C и n0: при n>n0 f(n) < Cg(n)

ОЦЕНКА СВЕРХУ ~ РАСТЁТ МЕДЛЕННЕЕ

f(n) = Ω(g(n)): существуют C и n0: при n>n0 f(n) > Cg(n)

ОЦЕНКА СНИЗУ ~ РАСТЁТ БЫСТРЕЕ

f(n) = Θ(g(n)): одновременно O и Ω

ОЦЕНКА С ДВУХ СТОРОН ~ РАСТЁТ С ТОЙ ЖЕ СКОРОСТЬЮ

42

Page 43: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Математика: варианты оценки затрат

f(n) = O(g(n)): существуют C и n0: при n>n0 f(n) < Cg(n)

ОЦЕНКА СВЕРХУ ~ РАСТЁТ МЕДЛЕННЕЕ

f(n) = Ω(g(n)): существуют C и n0: при n>n0 f(n) > Cg(n)

ОЦЕНКА СНИЗУ ~ РАСТЁТ БЫСТРЕЕ

f(n) = Θ(g(n)): одновременно O и Ω

ОЦЕНКА С ДВУХ СТОРОН ~ РАСТЁТ С ТОЙ ЖЕ СКОРОСТЬЮ

f(n) = o(g(n)): для любого (сколь угодно малого) коэффициентаC существует n0: при n>n0...

РАСТЁТ ЗНАЧИТЕЛЬНО МЕДЛЕННЕЕ

43

Page 44: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Математика: варианты оценки затрат

Программисты, как правило, используют O

Действительно, важна в первую очередь верхняя граница

Но найти её важно точно

и поэтому часто имеется в виду оценка с двух сторон (Θ)

44

Page 45: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Принцип декомпозиции

Или “Разделяй и властвуй”

Рекурсивный подход

Разделение

Задача делится на k меньших частей (часто на две)

Властвование

Каждая из частей решается отдельно (если требуется, таким жеобразом, как и первая)

Комбинирование

Затем результаты объединяются

45

Page 46: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Сортировка слиянием: принцип

Разделение

Делим n элементов на левую и правую половину

Властвование

Упорядочиваем каждую половину отдельно

Комбинирование

Составляем две половины вместе

46

Page 47: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Пример: сортировка слиянием

Код на Java в примере lesson1.Sorts

Псевдокод комбинирования (left, right → list)

li = 0 ri = 0 for i = 0 to list.size - 1:

if left[li] <= right[ri]: // ~~~ IOBE list[i] = left[li++]

else:list[i] = right[ri++]

47

Page 48: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Cортировка слиянием: O(?)

Псевдокодsort(list, p = 0, q = list.size): // S(N)

m = (p + q) / 2 // 1 sort(list, p, m) // S(N/2) sort(list, m, q) // S(N/2) merge(list, p, m, q) // 5N

48

Page 49: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Cортировка слиянием: O(?)

Псевдокодsort(list, p = 0, q = list.size): // S(N)

m = (p + q) / 2 // 1 sort(list, p, m) // S(N/2) sort(list, m, q) // S(N/2) merge(list, p, m, q) // 5N

49

Page 50: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Cортировка слиянием: O(?)

Псевдокодsort(list, p = 0, q = list.size): // S(N)

m = (p + q) / 2 // 1 sort(list, p, m) // S(N/2) sort(list, m, q) // S(N/2) merge(list, p, m, q) // 5N

S(N) = 2S(N/2)+5N+1

Верно ли: O(N) = 2O(N/2)+5N+1 = O(N)+O(N) = O(N) ?

50

Page 51: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Cортировка слиянием: O(?)

Псевдокодsort(list, p = 0, q = list.size): // S(N)

m = (p + q) / 2 // 1 sort(list, p, m) // S(N/2) sort(list, m, q) // S(N/2) merge(list, p, m, q) // 5N

S(N) = 2S(N/2)+5N+1

Верно ли: O(N) = 2O(N/2)+5N+1 = O(N)+O(N) = O(N) ?

А так: S(N) = 2S(N/2) + O(N) ?

51

Page 52: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Cортировка слиянием: O(?)

Псевдокодsort(list, p = 0, q = list.size): // S(N)

m = (p + q) / 2 // 1 sort(list, p, m) // S(N/2) sort(list, m, q) // S(N/2) merge(list, p, m, q) // 5N

S(N) = 2S(N/2)+5N+1

Верно ли: O(N) = 2O(N/2)+5N+1 = O(N)+O(N) = O(N) ?

А так: S(N) = 2S(N/2) + O(N) ?

Как насчёт наилучшего и наихудшего варианта?

52

Page 53: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Как решать (проверять): принцип

Рекуррентное соотношение

S(N) = 2S(N/2) + O(N)

53

Page 54: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Как решать (проверять): принцип

Рекуррентное соотношение

S(N) = 2S(N/2) + O(N)

Предположим: S(N) = O(N) ~ C * N

C * N = 2C * N/2 + D * N = C * N + D * N

НЕВЕРНО

54

Page 55: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Как решать (проверять): принцип

Рекуррентное соотношение

S(N) = 2S(N/2) + O(N)

Предположим: S(N) = O(N) ~ C * N

C * N = 2C * N/2 + D * N = C * N + D * N

НЕВЕРНО

Предположим: S(N) = O(N2) ~ C * N2

C * N2 = 2C * N2/4 + D * N = C * N2/2 + D * N

НЕВЕРНО

55

Page 56: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Как решать (проверять): принцип

Рекуррентное соотношение

S(N) = 2S(N/2) + O(N)

Предположим: S(N) = O(N) ~ C * N

C * N = 2C * N/2 + D * N = C * N + D * N

НЕВЕРНО

Предположим: S(N) = O(N2) ~ C * N2

C * N2 = 2C * N2/4 + D * N = C * N2/2 + D * N

НЕВЕРНО

Предположим: S(N) = O(NlgN) ~ C * NlgN

C * NlgN = 2C * Nlg(N/2) / 2 + D * N = C * NlgN – C * Nlg2 + D * N

ВЕРНО

56

Page 57: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Максимальный подмассив

Есть (известен) массив цен на акции Price[]

Требуется выбрать два дня i, j, такие, что

j > i (!!!)

Price[j] – Price[i] → MAX

То есть ВНАЧАЛЕ купить дёшево, ПОТОМ продать дорого

Примеры

100, 113, 110, 85, 105, 102, 86, 63, 81, 101, 94, 106, 101, 79, 94

10, 11, 7, 10, 6

57

Page 58: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Максимальный подмассив

Есть (известен) массив цен на акции Price[]

Требуется выбрать два дня i, j, такие, что

j > i (!!!)

Price[j] – Price[i] → MAX

То есть ВНАЧАЛЕ купить дёшево, ПОТОМ продать дорого

Примеры

100, 113, 110, 85, 105, 102, 86, 63, 81, 101, 94, 106, 101, 79, 94

10, 11, 7, 10, 6

58

Page 59: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Вариация

Берём массив цен Price[]

Формируем массив изменений Delta[] : Delta[i] = Price[i+1] – Price[i]

Требуется найти подмассив Delta, такой, что сумма егоэлементов максимальна

МАКСИМАЛЬНЫЙ ПОДМАССИВ

59

Page 60: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Варианты решения

В лоб

Разделяй и властвуй

Рекуррентный

60

Page 61: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Варианты решения

В лоб

Просто перебираем все варианты: O(N2)

Разделяй и властвуй

Разбиваем массив дельт на две половины

В каждой ищем максимальный подмассив

Сравниваем его с тем, который проходит через обе половины

61

Page 62: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Варианты решения

Разделяй и властвуй

Разбиваем массив дельт на две половины

В каждой ищем максимальный подмассив

Сравниваем его с тем, который проходит через обе половины

Рекуррентный

Ищем максимальный подмассив для массива размером J-1

Далее одно из двух

Либо он максимален и для размера J

Либо для размера J максимален подмассив, включающий последнийэлемент

62

Page 63: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Задача умножения матриц

Упрощённый вариант: квадратные матрицы размером M x M, причём M является степенью двойки

Вариант “в лоб”

Вычисление каждого элемента произведения требует M умножений и M-1 сложений

Элементов имеется M2

Общая трудоёмкость O(M3)

Рекурсивный вариант

Делим каждую матрицу на четыре подматрицы

A11 A12 B11 B12

A21 A22 B21 B22

Перемножаем подматрицы отдельно, потом сливаем вместе

S(M) = 8S(M/2) + O(M2) ==> S(M) = O(M3)

63

Page 64: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Метод Штрассена

Идея: уменьшить число перемножений подматриц с 8 до7, сведя рекуррентное соотношение к следующему

S(M) = 7S(M/2) + O(M2) ==> S(M) = O(M2.81)

С этой целью из 8 подматриц Aij / Bij

формируется ещё 10 матриц Sk = Aij +/- Bmn, вычисляется 7 произведений, суммируются результаты для формирования A x B

Подробности см. книгу Кормена

64

Page 65: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Итоги

Рассмотрели

Рекуррентный и рекурсивный (разделяй и властвуй) подходы

Оценки эффективности

Наилучший / наихудший случай

Примеры применения на практике

Далее

Алгоритмы сортировки

65

Page 66: Алгоритмы и структуры данных - spbstu.rukspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf · 2017-09-20 · Алгоритмы и структуры данных

Домашнее задание

Решить на одном из языков (Java, Kotlin) задачу о поискемаксимального подмассива одним из следующих способов:

Применив метод «Разделяй и властвуй»

Применив рекуррентный метод

Придумав своё решение, более эффективное, чем решение «В лоб»

Дедлайн: 26 сентября

66