SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
Лекция 1.
ВВЕДЕНИЕ В КУРС.
ПРОСТЕЙШИЕ
АЛГОРИТМЫ.
Мацкевич С.Е.
О себе





Учился в 57 школе в 1998-2001гг,
Окончил мех-мат МГУ в 2006г,
Кандидат физ.-мат. наук в 2010г,
Работаю в «ABBYY» с 2006 по н.в. Участвовал в
разработке:
 ABBYY Compreno (анализ текста, перевод),
 ABBYY FactExtractor (система хранения фактов).

 Преподаю в МФТИ с 2009 по н.в. на факультете Инноваций
и Высоких Технологий (доцент):
 Алгоритмы и структуры данных (семинары),
 Базы данных (семинары),
 Программирование под Windows (лекции и семинары).
2
План занятий
1. Простейшие алгоритмы и структуры
данных.

2. Сортировки.

Лекция 1. Семинар 1.
Лекция 2. Семинар 2.
Семинар 3.
Семинар 4 (рубежный контроль).

Лекция 3. Семинар 5.
Лекция 4. Семинар 6.
Семинар 7.
Семинар 8 (рубежный контроль).

3. Деревья.

4. Хеш-таблицы. Динамическое
программирование и жадные алгоритмы.

Лекция 5. Семинар 9.
Лекция 6. Семинар 10.
Семинар 11.
Семинар 12 (рубежный контроль).

Лекция 7. Семинар 13.
Лекция 8. Семинар 14.
Семинар 15.

Экзамен. Пересдача.

3
План лекции 1










Понятие алгоритма и структуры данных.
Обзор алгоритмов и структур данных. Литература.
Понятие вычислительной сложности. O-нотация.
Вычисление n-ого числа Фибоначчи.
Проверка числа на простоту.
Быстрое возведение числа в целую степень (за log(n)).
Массивы. Однопроходные алгоритмы.
Линейный поиск. Поиск минимального элемента.
Бинарный поиск. Рекурсивный и нерекурсивный
алгоритмы.
4
Определения
 Алгоритм – это формально описанная вычислительная
процедура, получающая исходные данные (input),
называемые также входом алгоритма или его
аргументом, и выдающая результат вычисления на
выход (output).
output Функция( input )
{
процедура;
}
Алгоритм определяет функцию (отображение) F : X → Y.
X – множество исходных данных, Y – множество значений.
5
Определения
 Структура данных – программная единица,
позволяющая хранить и обрабатывать множество
однотипных и/или логически связанных данных.
Типичные операции:

– добавление данных,
– изменение данных,
– удаление данных,
– поиск данных.

6
Обзор алгоритмов и структур данных
Базовые алгоритмы с массивами
 СД «Массив».
 Линейный (последовательный) поиск,
 Бинарный поиск.

 Сортировка массива.
 Сортировка вставками,
 Сортировка слиянием,
 Сортировка пузырьком,
 Быстрая сортировка,
 Пирамидальная сортировка,
 Сортировка подсчетом и др…
7
Обзор алгоритмов и структур данных
Базовые структуры данных
 СД «Динамический массив»
 СД «Однонаправленный список»
 СД «Двунаправленный список»
 СД «Стек»
 СД «Очередь»
 СД «Дек»
 СД «Двоичная куча» и «Очередь с приоритетом»
 СД «Система непересекающихся множеств»
8
Обзор алгоритмов и структур данных
Деревья
 СД «Двоичное дерево»
 Алгоритмы обхода дерева в ширину и в глубину.

 СД «Дерево поиска». Сбалансированные деревья
 СД «АВЛ-дерево»,
 СД «Красно-черное дерево»,
 СД «Ассоциативный массив».

 СД «Дерево отрезков»
 СД «B-дерево»
9
Обзор алгоритмов и структур данных
Хеширование
 Алгоритмы вычисления хеш-функций.
 Хеш-функции для строк.

 СД «Хеш-таблица»
 Реализация хеш-таблицы методом цепочек,
 Реализация хеш-таблицы методом открытой адресации.

10
Обзор алгоритмов и структур данных
Графы
 Обходы в ширину и глубину.
 Топологическая сортировка.
 Поиск сильносвязных компонент.
 Поиск кратчайших путей между
вершинами.
 Нахождение остовного дерева минимального веса.
 Вычисление максимального потока в сети.
 Задача коммивояжера.
11
Обзор алгоритмов и структур данных
Строки
 Поиск подстрок
 Алгоритм Кнута-Морриса-Карпа,
 Алгоритм Ахо-Корасик

 Индексирование текста
 Бор,
 Суффиксный массив,

 Суффиксное дерево,
 Суффиксный автомат.

 Регулярные выражения
12
Обзор алгоритмов и структур данных
 Вычислительная геометрия
 Теория игр

 Полиномы и быстрое преобразование Фурье
 Матрицы

 Алгоритмы сжатия
 Решение уравнений

13
Литература
 Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К,
Алгоритмы. Построение и анализ., 2-е изд, М.:
Издательский дом «Вильямс», 2005.
 Седжвик Р., Фундаментальные алгоритмы на C++,
части 1-4, анализ, структуры данных, сортировка,
поиск, М.: ДиаСофт, 2001.
 Шень А., Программирование: теоремы и задачи, 2-е
изд., испр. и доп., М.: МЦНМО, 2004.

14
Анализ алгоритмов
Эффективность алгоритма определяется различными
характеристиками, зависящими от исходных данных:

 Временем работы,
 Объемом дополнительно используемой памяти,

 Другие характеристики. Например, количество
операций сравнения или количество обращений к
диску.

15
Анализ алгоритмов
Часто исходные данные характеризуются натуральным
числом n.
Тогда время работы алгоритма – T(n).
Объем доп. памяти – M(n).
Пример. В задаче сортировки массива важен размер
исходного массива.
Исходные данные могут характеризоваться несколькими
числами.
Пример. Задача поиска всех вхождений строки-шаблона T
длины k в строку S длины n. В этой задаче время работы
алгоритма T(n, k) может зависеть от двух чисел n и k.
16
Асимптотические обозначения
Для обозначения асимптотического поведения времени работы
алгоритма (или объема памяти) используются Θ, O и Ω –
обозначения.
Определение. Для функции g(n) записи Θ(g(n)), O(g(n)) и Ω(g(n))
означают следующие множества функций:
Θ 𝑔 𝑛 = {𝑓 𝑛 : существуют положительные константы 𝑐1 , 𝑐2 и 𝑛0 ,
такие что 0 ≤ 𝑐1 𝑔 𝑛 ≤ 𝑓 𝑛 ≤ 𝑐2 𝑔 𝑛 для всех 𝑛 ≥ 𝑛0 },
𝑂 𝑔 𝑛 = {𝑓 𝑛 : существуют положительные константы 𝑐 и 𝑛0 ,
такие что 0 ≤ 𝑓 𝑛 ≤ 𝑐𝑔 𝑛 для всех 𝑛 ≥ 𝑛0 },
Ω 𝑔 𝑛 = {𝑓 𝑛 : существуют положительные константы 𝑐 и 𝑛0 ,
такие что 0 ≤ 𝑐𝑔 𝑛 ≤ 𝑓 𝑛 для всех 𝑛 ≥ 𝑛0 }.

Обозначение. Вместо записи «𝑇(𝑛) ∈ Θ(𝑔(𝑛))» часто используют
запись «𝑇 𝑛 = Θ(𝑔 𝑛 )».
17
Асимптотические обозначения
Примеры.
 𝑇 𝑛 = Θ(𝑛).
Линейное время.
разг. «за линию».
 𝑇 𝑛 = Θ 𝑛2 .
Квадратичное время.
разг. «за квадрат».
 𝑇 𝑛 = Θ(log 𝑛). Логарифм.
 𝑇 𝑛 = Θ 𝑛 log 𝑛 .
 𝑇 𝑛 =Θ 𝑒𝑛 .
18
Числа Фибоначчи
Задача. Найти n-ое число
Фибоначчи.

F(0) = 1; F(1) = 1;
F(n) = F(n – 1) + F(n – 2);
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

Есть рекурсивный и
нерекурсивный алгоритмы.
19
Числа Фибоначчи
// Рекурсивный алгоритм.
int Fibonacci1( int n )
{
if( n == 0 || n == 1 ) {
return 1;
}
return Fibonacci1( n – 1 ) + Fibonacci1( n – 2 );
}

20
Числа Фибоначчи
// Нерекурсивный алгоритм.
int Fibonacci2( int n )
{
if( n == 0 ) {
return 1;
}
int prev = 1; // F(0).
int current = 1; // F(1).
for( int i = 2; i <= n; i++ ) {
int temp = current;
current += prev; // Вычисление F(i).
prev = temp; // Запоминаем F(i-1).
}
return current;
}
21
Числа Фибоначчи
Рекурсивный алгоритм
Время работы T(n) больше, чем количество вызовов Fibonacci1(1),
которое равно F(n-1).

Формула Бине: 𝑭 𝒏 =

𝝋 𝒏 − −𝝋 −𝒏
,
𝟐𝝋−𝟏
𝒏

где 𝝋 – золотое сечение.

Таким образом, 𝑻 𝒏 = 𝛀 𝝋 .
Объем доп. памяти 𝑴 𝒏 = 𝑶 𝒏 – максимальная глубина рекурсии.

Нерекурсивный алгоритм
Время работы 𝑻 𝒏 = 𝑶 𝒏 – количество итераций в цикле.
Объем доп. памяти 𝑴 𝒏 = 𝑶 𝟏 .

22
Проверка числа на простоту
Задача. Проверить, является ли заданное
натуральное число n простым.

Можем быстро определять, делится ли одно
натуральное число (n) на другое (k), проверив остаток
от деления:
n % k == 0
Будем перебирать все числа от 1 до
делит ли какое-нибудь из них n.

𝒏, проверяя,

23
Проверка числа на простоту
bool IsPrime( int n )
{
if( n == 1 ) {
return false;
}
for( int i = 2; i * i <= n; i++ ) {
if( n % i == 0 ) {
return false;
}
}
return true;
}
24
Проверка числа на простоту
Время работы 𝑻 𝒏 = 𝑶( 𝒏).
Объем доп. памяти 𝑴 𝒏 = 𝑶(𝟏).
 Существует алгоритм, проверяющий число на
простоту за полиномиальное время (от log) –
Тест Агравала – Каяла – Саксены (2002 год).
Время работы его улучшенной версии (2011год)
𝑻 𝒏 = 𝑶 log 3 𝒏 .

25
Быстрое возведение в степень
Задача. Дано число a и неотрицательное целое число n.
Найти 𝒂 𝒏 .

Тривиальный алгоритм: перемножить n-1 раз число a:
𝒂 ∙ 𝒂 ∙ ⋯∙ 𝒂
Время работы тривиального алгоритма 𝑻 𝒏 = 𝑶(𝒏).
𝒌

 Воспользуемся тем, что 𝒂 𝟐 =

𝒂

𝟐 𝟐

⋯𝟐

𝒌 раз .

Если 𝒏 = 𝟐 𝒌 𝟏 + 𝟐 𝒌 𝟐 + ⋯ + 𝟐 𝒌 𝒔 , то
𝒏

𝒂 = 𝒂

𝟐𝒌𝟏

𝒂

𝟐𝒌𝟐

⋯ 𝒂

𝟐 𝒌 𝒔.
26
Быстрое возведение в степень
bool Power( double a, int n )
{
double result = 1; // Для хранения результата.
double aInDegreeOf2 = a; // Текущее значение ((a^2)^2…)^2
while( n > 0 ) {
// Добавляем нужную степень двойки к результату,
// если она есть в разложении n.
if( n % 2 == 1 ) {
result *= aInDegreeOf2;
}
aInDegreeOf2 *= aInDegreeOf2;
n /= 2; // Можно писать n >> 1.
}
return result;
}
27
Быстрое возведение в степень
Количество итераций цикла = степень двойки, не
превышающая n, т.е. log(𝑛).
𝑇(𝑛) = 𝑂(log 𝑛),
𝑀(𝑛) = 𝑂(1).

28
Массивы
Определение 1. Массив – набор однотипных компонентов
(элементов), расположенных в памяти непосредственно друг за
другом, доступ к которым осуществляется по индексу (индексам).
Традиционно индексирование элементов массивов начинают с 0.

Определение 2. Размерность массива – количество индексов,
необходимое для однозначного доступа к элементу массива.
 Одномерный массив целых чисел:
20

34

11

563

23

-1

2

0

-33

7

0

1

2

3

4

5

6

7

8

9
29
Массивы
Для передачи массива в функцию можно передать
указатель на начало массива и количество элементов.
void Function1( int* arr, int count );
void Function2( const int* arr, int count );

30
Массивы. Линейный поиск
Задача 1. Проверить, есть ли заданный элемент в
массиве.

Решение. Последовательно проверяем все элементы
массива, пока не найдем заданный элемент, либо пока
не закончится массив.
Время работы в худшем случае 𝑇 𝑛 = 𝑂 𝑛 , где n –
количество элементов в массиве.

31
Массивы
 Массив символов – строка.
Часто после последнего символа ставят символ с кодом 0. Чтобы
во время передачи строки не передавать число элементов.
Символы могут быть однобайтными (char) или двубайтными
(wchar_t).

void
void
void
void

Function1(
Function2(
Function3(
Function4(

char* str );
const char* str );
wchar_t* str );
const wchar_t* str );

Т

е

х

н

о

п

а

р

к

0

0

1

2

3

4

5

6

7

8

9
32
Массивы. Линейный поиск.
// Проверка наличия элемента.
bool HasElement( const double* arr, int count,
double element )
{
for( int i = 0; i < count; i++ ) {
if( arr[i] == element ) { // Нашли.
return true;
}
}
return false;
}

33
Массивы. Линейный поиск
Задача 2. Проверить, есть ли заданный элемент в
массиве. Если он есть, вернуть позицию его первого
вхождения. Если его нет, вернуть -1.
Решение. Последовательно проверяем все элементы
массива, пока не найдем заданный элемент. Если нашли,
возвращаем его позицию. Если не нашли, возвращаем -1.
Время работы в худшем случае 𝑇 𝑛 = 𝑂 𝑛 , где n –
количество элементов в массиве.

34
Массивы. Линейный поиск.
// Возвращает позицию элемента, если он есть
// в массиве. Возвращает -1, если его нет.
int FindElement( const double* arr, int count,
double element )
{
for( int i = 0; i < count; i++ ) {
if( arr[i] == element ) { // Нашли.
return i;
}
}
return -1;
}
35
Массивы. Линейный поиск
Задача 3. Найти максимальный элемент в массиве.
Вернуть его значение.

Решение. Последовательно проверяем все элементы
массива, запоминаем текущее значение максимума.
Время работы 𝑇 𝑛 = 𝑂 𝑛 , где n – количество
элементов в массиве.

36
Массивы. Линейный поиск.
// Возвращает максимальный элемент в массиве.
int MaxElement( const double* arr, int count )
{
// Число элементов должно быть больше 0.
assert( count > 0 );
double currentMax = arr[0];
for( int i = 1; i < count; i++ ) {
if( arr[i] > currentMax ) { // Нашли новый.
currentMax = arr[i];
}
}
return currentMax;
}
37
Массивы. Бинарный поиск.
Определение. Упорядоченный по возрастанию массив – массив
A, элементы которого сравнимы, и для любых индексов k и l, 𝑘 <
𝑙:
𝐴 𝑘 ≤ 𝐴 𝑙.
Упорядоченный по убыванию массив определяется аналогично.
-40

-12

0

1

2

6

22

54

343

711

0

1

2

3

4

5

6

7

8

9

38
Массивы. Бинарный поиск
Задача (Бинарный поиск = Двоичный поиск).
Проверить, есть ли заданный элемент в упорядоченном
массиве. Если он есть, вернуть позицию его первого
вхождения. Если его нет, вернуть -1.
Решение. Шаг. Сравниваем элемент в середине массива
(медиану) с заданным элементом. Выбираем нужную
половинку массива в зависимости результата сравнения.
Повторяем этот шаг до тех пор, пока размер массива не
уменьшится до 1.

39
Массивы. Бинарный поиск.
// Возвращает позицию вставки элемента на отрезке [first, last].
int FindInsertionPoint( const double* arr, int first,
int last, double element )
{
if( last – first == 1 )
return element <= arr[first] ? first : last;

}

int mid = ( first + last ) / 2;
if( element <= arr[mid] )
return FindInsertionPoint( arr, first, mid, element );
else
return FindInsertionPoint( arr, mid, last, element );

// Возвращает позицию элемента в упорядоченном массиве, если он есть.
// Возвращает -1, если его нет.
int BinarySearch( const double* arr, int count, double element )
{
int point = FindInsertionPoint( arr, 0, count, element );
return ( point == count || arr[point] != element ) ? -1 : point;
}
40
Массивы. Бинарный поиск
// Бинарный поиск без рекурсии.
int BinarySearch2( double* arr, int count, double element )
{
int first = 0;
int last = count; // Элемент в last не учитывается.
while( first < last ) {
int mid = ( first + last ) / 2;
if( element <= arr[mid] )
last = mid;
else
first = mid + 1; // Здесь отличие от BinarySearch1.
}
// Все элементы слева от first строго больше искомого.
return ( first == count || arr[first] != element ) ? -1 :
first;
}
41
Массивы. Бинарный поиск
Время работы 𝑇 𝑛 = 𝑂 log 𝑛 , где n – количество
элементов в массиве.

Объем дополнительной памяти:
В нерекурсивном алгоритме 𝑀 𝑛 = 𝑂 1 .
В рекурсивном алгоритме 𝑀 𝑛 = 𝑂 log 𝑛 , так как
максимальная глубина рекурсии – log 𝑛.

42
Итог
Было рассказано на лекции:
 Понятие алгоритма и структуры данных.
 Обзор.








Анализ алгоритмов. Θ 𝑔 𝑛 , 𝑂 𝑔 𝑛 , Ω 𝑔 𝑛 .
Вычисление n-ого числа Фибоначчи.
Проверка числа на простоту.
Быстрое возведение в степень.
Массивы.
Линейный поиск.
Бинарный поиск.
43
Вопросы?
Спасибо за внимание!

Contenu connexe

Tendances

Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Mikhail Kurnosov
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
Mikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
Mikhail Kurnosov
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Mikhail Kurnosov
 

Tendances (20)

Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Алгоритмы поиска
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 

En vedette

Android осень 2013 лекция 5
Android осень 2013 лекция 5Android осень 2013 лекция 5
Android осень 2013 лекция 5
Technopark
 
Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5
Technopark
 
Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5
Technopark
 
Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3
Technopark
 
рычаги в технике, быту и природе
рычаги в технике, быту и природерычаги в технике, быту и природе
рычаги в технике, быту и природе
Ольга Евдокимова
 
Смысл и значение этики
Смысл и значение этикиСмысл и значение этики
Смысл и значение этики
Tanya67
 
Lecturesnikitsin
LecturesnikitsinLecturesnikitsin
Lecturesnikitsin
anikitsin
 
Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014
Technopark
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7
Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
Technopark
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
Technopark
 

En vedette (20)

Android осень 2013 лекция 5
Android осень 2013 лекция 5Android осень 2013 лекция 5
Android осень 2013 лекция 5
 
Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5
 
Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5Безопасность интернет-приложений осень 2013 лекция 5
Безопасность интернет-приложений осень 2013 лекция 5
 
Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3Управление продуктом осень 2013 лекция 3
Управление продуктом осень 2013 лекция 3
 
Введение в синтаксис C++, часть 1
Введение в синтаксис C++, часть 1Введение в синтаксис C++, часть 1
Введение в синтаксис C++, часть 1
 
рычаги в технике, быту и природе
рычаги в технике, быту и природерычаги в технике, быту и природе
рычаги в технике, быту и природе
 
Смысл и значение этики
Смысл и значение этикиСмысл и значение этики
Смысл и значение этики
 
История Квебека
История КвебекаИстория Квебека
История Квебека
 
Облачные сервисы
Облачные сервисыОблачные сервисы
Облачные сервисы
 
Lecturesnikitsin
LecturesnikitsinLecturesnikitsin
Lecturesnikitsin
 
Точка кипения: проектирование крупных веб-систем
Точка кипения:  проектирование крупных веб-системТочка кипения:  проектирование крупных веб-систем
Точка кипения: проектирование крупных веб-систем
 
Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014Безопасность лекция 1 весна 2014
Безопасность лекция 1 весна 2014
 
Om bhadram karnebhih shrinuyama devah
Om bhadram karnebhih shrinuyama devahOm bhadram karnebhih shrinuyama devah
Om bhadram karnebhih shrinuyama devah
 
облачные сервисы
облачные сервисыоблачные сервисы
облачные сервисы
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7
 
Actualités sur Google et le SEO - Février 2015
Actualités sur Google et le SEO - Février 2015Actualités sur Google et le SEO - Février 2015
Actualités sur Google et le SEO - Février 2015
 
Облачные вычисления: архитектура, распределение ответственности и защита инфо...
Облачные вычисления: архитектура, распределение ответственности и защита инфо...Облачные вычисления: архитектура, распределение ответственности и защита инфо...
Облачные вычисления: архитектура, распределение ответственности и защита инфо...
 
Регулярные выражения C++
Регулярные выражения C++Регулярные выражения C++
Регулярные выражения C++
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
 
Java весна 2014 лекция 1
Java весна 2014 лекция 1Java весна 2014 лекция 1
Java весна 2014 лекция 1
 

Similaire à Алгоритмы и структуры данных осень 2013 лекция 1

чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
sharikdp
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
Technopark
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсия
Evgeny Smirnov
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Mikhail Kurnosov
 
тема множество для загрузки 2013
тема множество для загрузки 2013тема множество для загрузки 2013
тема множество для загрузки 2013
AliyaAringazinova
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Nikolay Grebenshikov
 
экспертные системы
экспертные системыэкспертные системы
экспертные системы
sokol_klinik
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
Mikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
Mikhail Kurnosov
 
практика 10
практика 10практика 10
практика 10
student_kai
 

Similaire à Алгоритмы и структуры данных осень 2013 лекция 1 (20)

чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
Алгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсияАлгоритмы на ruby: перебор и рекурсия
Алгоритмы на ruby: перебор и рекурсия
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
тема множество для загрузки 2013
тема множество для загрузки 2013тема множество для загрузки 2013
тема множество для загрузки 2013
 
Diskretn analiz
Diskretn analizDiskretn analiz
Diskretn analiz
 
Diskretn analiz
Diskretn analizDiskretn analiz
Diskretn analiz
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
Algo 01 part01
Algo 01 part01Algo 01 part01
Algo 01 part01
 
экспертные системы
экспертные системыэкспертные системы
экспертные системы
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
4 algoritm
4 algoritm4 algoritm
4 algoritm
 
Алгоритм
АлгоритмАлгоритм
Алгоритм
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
практика 10
практика 10практика 10
практика 10
 

Plus de Technopark

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 

Plus de Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 

Алгоритмы и структуры данных осень 2013 лекция 1

  • 1. Лекция 1. ВВЕДЕНИЕ В КУРС. ПРОСТЕЙШИЕ АЛГОРИТМЫ. Мацкевич С.Е.
  • 2. О себе     Учился в 57 школе в 1998-2001гг, Окончил мех-мат МГУ в 2006г, Кандидат физ.-мат. наук в 2010г, Работаю в «ABBYY» с 2006 по н.в. Участвовал в разработке:  ABBYY Compreno (анализ текста, перевод),  ABBYY FactExtractor (система хранения фактов).  Преподаю в МФТИ с 2009 по н.в. на факультете Инноваций и Высоких Технологий (доцент):  Алгоритмы и структуры данных (семинары),  Базы данных (семинары),  Программирование под Windows (лекции и семинары). 2
  • 3. План занятий 1. Простейшие алгоритмы и структуры данных. 2. Сортировки. Лекция 1. Семинар 1. Лекция 2. Семинар 2. Семинар 3. Семинар 4 (рубежный контроль). Лекция 3. Семинар 5. Лекция 4. Семинар 6. Семинар 7. Семинар 8 (рубежный контроль). 3. Деревья. 4. Хеш-таблицы. Динамическое программирование и жадные алгоритмы. Лекция 5. Семинар 9. Лекция 6. Семинар 10. Семинар 11. Семинар 12 (рубежный контроль). Лекция 7. Семинар 13. Лекция 8. Семинар 14. Семинар 15. Экзамен. Пересдача. 3
  • 4. План лекции 1          Понятие алгоритма и структуры данных. Обзор алгоритмов и структур данных. Литература. Понятие вычислительной сложности. O-нотация. Вычисление n-ого числа Фибоначчи. Проверка числа на простоту. Быстрое возведение числа в целую степень (за log(n)). Массивы. Однопроходные алгоритмы. Линейный поиск. Поиск минимального элемента. Бинарный поиск. Рекурсивный и нерекурсивный алгоритмы. 4
  • 5. Определения  Алгоритм – это формально описанная вычислительная процедура, получающая исходные данные (input), называемые также входом алгоритма или его аргументом, и выдающая результат вычисления на выход (output). output Функция( input ) { процедура; } Алгоритм определяет функцию (отображение) F : X → Y. X – множество исходных данных, Y – множество значений. 5
  • 6. Определения  Структура данных – программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных. Типичные операции: – добавление данных, – изменение данных, – удаление данных, – поиск данных. 6
  • 7. Обзор алгоритмов и структур данных Базовые алгоритмы с массивами  СД «Массив».  Линейный (последовательный) поиск,  Бинарный поиск.  Сортировка массива.  Сортировка вставками,  Сортировка слиянием,  Сортировка пузырьком,  Быстрая сортировка,  Пирамидальная сортировка,  Сортировка подсчетом и др… 7
  • 8. Обзор алгоритмов и структур данных Базовые структуры данных  СД «Динамический массив»  СД «Однонаправленный список»  СД «Двунаправленный список»  СД «Стек»  СД «Очередь»  СД «Дек»  СД «Двоичная куча» и «Очередь с приоритетом»  СД «Система непересекающихся множеств» 8
  • 9. Обзор алгоритмов и структур данных Деревья  СД «Двоичное дерево»  Алгоритмы обхода дерева в ширину и в глубину.  СД «Дерево поиска». Сбалансированные деревья  СД «АВЛ-дерево»,  СД «Красно-черное дерево»,  СД «Ассоциативный массив».  СД «Дерево отрезков»  СД «B-дерево» 9
  • 10. Обзор алгоритмов и структур данных Хеширование  Алгоритмы вычисления хеш-функций.  Хеш-функции для строк.  СД «Хеш-таблица»  Реализация хеш-таблицы методом цепочек,  Реализация хеш-таблицы методом открытой адресации. 10
  • 11. Обзор алгоритмов и структур данных Графы  Обходы в ширину и глубину.  Топологическая сортировка.  Поиск сильносвязных компонент.  Поиск кратчайших путей между вершинами.  Нахождение остовного дерева минимального веса.  Вычисление максимального потока в сети.  Задача коммивояжера. 11
  • 12. Обзор алгоритмов и структур данных Строки  Поиск подстрок  Алгоритм Кнута-Морриса-Карпа,  Алгоритм Ахо-Корасик  Индексирование текста  Бор,  Суффиксный массив,  Суффиксное дерево,  Суффиксный автомат.  Регулярные выражения 12
  • 13. Обзор алгоритмов и структур данных  Вычислительная геометрия  Теория игр  Полиномы и быстрое преобразование Фурье  Матрицы  Алгоритмы сжатия  Решение уравнений 13
  • 14. Литература  Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К, Алгоритмы. Построение и анализ., 2-е изд, М.: Издательский дом «Вильямс», 2005.  Седжвик Р., Фундаментальные алгоритмы на C++, части 1-4, анализ, структуры данных, сортировка, поиск, М.: ДиаСофт, 2001.  Шень А., Программирование: теоремы и задачи, 2-е изд., испр. и доп., М.: МЦНМО, 2004. 14
  • 15. Анализ алгоритмов Эффективность алгоритма определяется различными характеристиками, зависящими от исходных данных:  Временем работы,  Объемом дополнительно используемой памяти,  Другие характеристики. Например, количество операций сравнения или количество обращений к диску. 15
  • 16. Анализ алгоритмов Часто исходные данные характеризуются натуральным числом n. Тогда время работы алгоритма – T(n). Объем доп. памяти – M(n). Пример. В задаче сортировки массива важен размер исходного массива. Исходные данные могут характеризоваться несколькими числами. Пример. Задача поиска всех вхождений строки-шаблона T длины k в строку S длины n. В этой задаче время работы алгоритма T(n, k) может зависеть от двух чисел n и k. 16
  • 17. Асимптотические обозначения Для обозначения асимптотического поведения времени работы алгоритма (или объема памяти) используются Θ, O и Ω – обозначения. Определение. Для функции g(n) записи Θ(g(n)), O(g(n)) и Ω(g(n)) означают следующие множества функций: Θ 𝑔 𝑛 = {𝑓 𝑛 : существуют положительные константы 𝑐1 , 𝑐2 и 𝑛0 , такие что 0 ≤ 𝑐1 𝑔 𝑛 ≤ 𝑓 𝑛 ≤ 𝑐2 𝑔 𝑛 для всех 𝑛 ≥ 𝑛0 }, 𝑂 𝑔 𝑛 = {𝑓 𝑛 : существуют положительные константы 𝑐 и 𝑛0 , такие что 0 ≤ 𝑓 𝑛 ≤ 𝑐𝑔 𝑛 для всех 𝑛 ≥ 𝑛0 }, Ω 𝑔 𝑛 = {𝑓 𝑛 : существуют положительные константы 𝑐 и 𝑛0 , такие что 0 ≤ 𝑐𝑔 𝑛 ≤ 𝑓 𝑛 для всех 𝑛 ≥ 𝑛0 }. Обозначение. Вместо записи «𝑇(𝑛) ∈ Θ(𝑔(𝑛))» часто используют запись «𝑇 𝑛 = Θ(𝑔 𝑛 )». 17
  • 18. Асимптотические обозначения Примеры.  𝑇 𝑛 = Θ(𝑛). Линейное время. разг. «за линию».  𝑇 𝑛 = Θ 𝑛2 . Квадратичное время. разг. «за квадрат».  𝑇 𝑛 = Θ(log 𝑛). Логарифм.  𝑇 𝑛 = Θ 𝑛 log 𝑛 .  𝑇 𝑛 =Θ 𝑒𝑛 . 18
  • 19. Числа Фибоначчи Задача. Найти n-ое число Фибоначчи. F(0) = 1; F(1) = 1; F(n) = F(n – 1) + F(n – 2); 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … Есть рекурсивный и нерекурсивный алгоритмы. 19
  • 20. Числа Фибоначчи // Рекурсивный алгоритм. int Fibonacci1( int n ) { if( n == 0 || n == 1 ) { return 1; } return Fibonacci1( n – 1 ) + Fibonacci1( n – 2 ); } 20
  • 21. Числа Фибоначчи // Нерекурсивный алгоритм. int Fibonacci2( int n ) { if( n == 0 ) { return 1; } int prev = 1; // F(0). int current = 1; // F(1). for( int i = 2; i <= n; i++ ) { int temp = current; current += prev; // Вычисление F(i). prev = temp; // Запоминаем F(i-1). } return current; } 21
  • 22. Числа Фибоначчи Рекурсивный алгоритм Время работы T(n) больше, чем количество вызовов Fibonacci1(1), которое равно F(n-1). Формула Бине: 𝑭 𝒏 = 𝝋 𝒏 − −𝝋 −𝒏 , 𝟐𝝋−𝟏 𝒏 где 𝝋 – золотое сечение. Таким образом, 𝑻 𝒏 = 𝛀 𝝋 . Объем доп. памяти 𝑴 𝒏 = 𝑶 𝒏 – максимальная глубина рекурсии. Нерекурсивный алгоритм Время работы 𝑻 𝒏 = 𝑶 𝒏 – количество итераций в цикле. Объем доп. памяти 𝑴 𝒏 = 𝑶 𝟏 . 22
  • 23. Проверка числа на простоту Задача. Проверить, является ли заданное натуральное число n простым. Можем быстро определять, делится ли одно натуральное число (n) на другое (k), проверив остаток от деления: n % k == 0 Будем перебирать все числа от 1 до делит ли какое-нибудь из них n. 𝒏, проверяя, 23
  • 24. Проверка числа на простоту bool IsPrime( int n ) { if( n == 1 ) { return false; } for( int i = 2; i * i <= n; i++ ) { if( n % i == 0 ) { return false; } } return true; } 24
  • 25. Проверка числа на простоту Время работы 𝑻 𝒏 = 𝑶( 𝒏). Объем доп. памяти 𝑴 𝒏 = 𝑶(𝟏).  Существует алгоритм, проверяющий число на простоту за полиномиальное время (от log) – Тест Агравала – Каяла – Саксены (2002 год). Время работы его улучшенной версии (2011год) 𝑻 𝒏 = 𝑶 log 3 𝒏 . 25
  • 26. Быстрое возведение в степень Задача. Дано число a и неотрицательное целое число n. Найти 𝒂 𝒏 . Тривиальный алгоритм: перемножить n-1 раз число a: 𝒂 ∙ 𝒂 ∙ ⋯∙ 𝒂 Время работы тривиального алгоритма 𝑻 𝒏 = 𝑶(𝒏). 𝒌  Воспользуемся тем, что 𝒂 𝟐 = 𝒂 𝟐 𝟐 ⋯𝟐 𝒌 раз . Если 𝒏 = 𝟐 𝒌 𝟏 + 𝟐 𝒌 𝟐 + ⋯ + 𝟐 𝒌 𝒔 , то 𝒏 𝒂 = 𝒂 𝟐𝒌𝟏 𝒂 𝟐𝒌𝟐 ⋯ 𝒂 𝟐 𝒌 𝒔. 26
  • 27. Быстрое возведение в степень bool Power( double a, int n ) { double result = 1; // Для хранения результата. double aInDegreeOf2 = a; // Текущее значение ((a^2)^2…)^2 while( n > 0 ) { // Добавляем нужную степень двойки к результату, // если она есть в разложении n. if( n % 2 == 1 ) { result *= aInDegreeOf2; } aInDegreeOf2 *= aInDegreeOf2; n /= 2; // Можно писать n >> 1. } return result; } 27
  • 28. Быстрое возведение в степень Количество итераций цикла = степень двойки, не превышающая n, т.е. log(𝑛). 𝑇(𝑛) = 𝑂(log 𝑛), 𝑀(𝑛) = 𝑂(1). 28
  • 29. Массивы Определение 1. Массив – набор однотипных компонентов (элементов), расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу (индексам). Традиционно индексирование элементов массивов начинают с 0. Определение 2. Размерность массива – количество индексов, необходимое для однозначного доступа к элементу массива.  Одномерный массив целых чисел: 20 34 11 563 23 -1 2 0 -33 7 0 1 2 3 4 5 6 7 8 9 29
  • 30. Массивы Для передачи массива в функцию можно передать указатель на начало массива и количество элементов. void Function1( int* arr, int count ); void Function2( const int* arr, int count ); 30
  • 31. Массивы. Линейный поиск Задача 1. Проверить, есть ли заданный элемент в массиве. Решение. Последовательно проверяем все элементы массива, пока не найдем заданный элемент, либо пока не закончится массив. Время работы в худшем случае 𝑇 𝑛 = 𝑂 𝑛 , где n – количество элементов в массиве. 31
  • 32. Массивы  Массив символов – строка. Часто после последнего символа ставят символ с кодом 0. Чтобы во время передачи строки не передавать число элементов. Символы могут быть однобайтными (char) или двубайтными (wchar_t). void void void void Function1( Function2( Function3( Function4( char* str ); const char* str ); wchar_t* str ); const wchar_t* str ); Т е х н о п а р к 0 0 1 2 3 4 5 6 7 8 9 32
  • 33. Массивы. Линейный поиск. // Проверка наличия элемента. bool HasElement( const double* arr, int count, double element ) { for( int i = 0; i < count; i++ ) { if( arr[i] == element ) { // Нашли. return true; } } return false; } 33
  • 34. Массивы. Линейный поиск Задача 2. Проверить, есть ли заданный элемент в массиве. Если он есть, вернуть позицию его первого вхождения. Если его нет, вернуть -1. Решение. Последовательно проверяем все элементы массива, пока не найдем заданный элемент. Если нашли, возвращаем его позицию. Если не нашли, возвращаем -1. Время работы в худшем случае 𝑇 𝑛 = 𝑂 𝑛 , где n – количество элементов в массиве. 34
  • 35. Массивы. Линейный поиск. // Возвращает позицию элемента, если он есть // в массиве. Возвращает -1, если его нет. int FindElement( const double* arr, int count, double element ) { for( int i = 0; i < count; i++ ) { if( arr[i] == element ) { // Нашли. return i; } } return -1; } 35
  • 36. Массивы. Линейный поиск Задача 3. Найти максимальный элемент в массиве. Вернуть его значение. Решение. Последовательно проверяем все элементы массива, запоминаем текущее значение максимума. Время работы 𝑇 𝑛 = 𝑂 𝑛 , где n – количество элементов в массиве. 36
  • 37. Массивы. Линейный поиск. // Возвращает максимальный элемент в массиве. int MaxElement( const double* arr, int count ) { // Число элементов должно быть больше 0. assert( count > 0 ); double currentMax = arr[0]; for( int i = 1; i < count; i++ ) { if( arr[i] > currentMax ) { // Нашли новый. currentMax = arr[i]; } } return currentMax; } 37
  • 38. Массивы. Бинарный поиск. Определение. Упорядоченный по возрастанию массив – массив A, элементы которого сравнимы, и для любых индексов k и l, 𝑘 < 𝑙: 𝐴 𝑘 ≤ 𝐴 𝑙. Упорядоченный по убыванию массив определяется аналогично. -40 -12 0 1 2 6 22 54 343 711 0 1 2 3 4 5 6 7 8 9 38
  • 39. Массивы. Бинарный поиск Задача (Бинарный поиск = Двоичный поиск). Проверить, есть ли заданный элемент в упорядоченном массиве. Если он есть, вернуть позицию его первого вхождения. Если его нет, вернуть -1. Решение. Шаг. Сравниваем элемент в середине массива (медиану) с заданным элементом. Выбираем нужную половинку массива в зависимости результата сравнения. Повторяем этот шаг до тех пор, пока размер массива не уменьшится до 1. 39
  • 40. Массивы. Бинарный поиск. // Возвращает позицию вставки элемента на отрезке [first, last]. int FindInsertionPoint( const double* arr, int first, int last, double element ) { if( last – first == 1 ) return element <= arr[first] ? first : last; } int mid = ( first + last ) / 2; if( element <= arr[mid] ) return FindInsertionPoint( arr, first, mid, element ); else return FindInsertionPoint( arr, mid, last, element ); // Возвращает позицию элемента в упорядоченном массиве, если он есть. // Возвращает -1, если его нет. int BinarySearch( const double* arr, int count, double element ) { int point = FindInsertionPoint( arr, 0, count, element ); return ( point == count || arr[point] != element ) ? -1 : point; } 40
  • 41. Массивы. Бинарный поиск // Бинарный поиск без рекурсии. int BinarySearch2( double* arr, int count, double element ) { int first = 0; int last = count; // Элемент в last не учитывается. while( first < last ) { int mid = ( first + last ) / 2; if( element <= arr[mid] ) last = mid; else first = mid + 1; // Здесь отличие от BinarySearch1. } // Все элементы слева от first строго больше искомого. return ( first == count || arr[first] != element ) ? -1 : first; } 41
  • 42. Массивы. Бинарный поиск Время работы 𝑇 𝑛 = 𝑂 log 𝑛 , где n – количество элементов в массиве. Объем дополнительной памяти: В нерекурсивном алгоритме 𝑀 𝑛 = 𝑂 1 . В рекурсивном алгоритме 𝑀 𝑛 = 𝑂 log 𝑛 , так как максимальная глубина рекурсии – log 𝑛. 42
  • 43. Итог Было рассказано на лекции:  Понятие алгоритма и структуры данных.  Обзор.        Анализ алгоритмов. Θ 𝑔 𝑛 , 𝑂 𝑔 𝑛 , Ω 𝑔 𝑛 . Вычисление n-ого числа Фибоначчи. Проверка числа на простоту. Быстрое возведение в степень. Массивы. Линейный поиск. Бинарный поиск. 43