Вы находитесь на странице: 1из 25

Основы

алгоритмизации
Лекция № 1
Литература
Литература
Литература
Зачем изучать алгоритмы
и структуры данных?
Алгоритмы лежат в основе компьютерных
наук и разработки программного обеспечения.
Реальная производительность любой
программной системы зависит только от двух
вещей:
• выбранного алгоритма
• эффективности его реализации.
Поэтому разработка хорошего алгоритма
критична для производительности всех
программных систем. Более того, изучение
алгоритмов способствует решению проблем
независимо от языка/парадигмы
программирования, аппаратного обеспечения и
других аспектов реализации
Computing Curriculum
Algorithms + Data Structures =
Programs
Алгоритмы + Структуры
данных = Программы
Никлаус Вирт — швейцарский учёный, специалист
в области информатики, один из известнейших
теоретиков в области разработки языков
программирования, профессор компьютерных наук . 
Если вы считаете себя действительно хорошим
программистом..., прочитайте "Искусство
программирования" (Кнута)...
Если вы сможете прочесть весь этот труд, то вам
определенно следует отправить мне резюме.
Билл Гейтс.
И вот аспирант Джин МакКенна приходит
на собеседование со специалистом по
подбору персонала корпорации Microsoft .
Предположим, у вас есть восемь
бильярдных шаров, — начинает тот. —
Один из шаров немного тяжелее, чем
остальные, но это можно определить
только при помощи взвешивания. За какое
минимальное количество взвешиваний на
весах без гирь вы можете определить
более тяжелый шар?
 
Сколько взвешиваний?
В теннисном турнире сто двадцать семь
участников. В первом туре сто двадцать шесть
игроков составят шестьдесят три пары,
победители которых выйдут в следующий тур, и
еще один игрок выходит во второй тур без игры.
В следующем туре — шестьдесят четыре
игрока сыграют тридцать два матча. Сколько
всего матчей понадобится, чтобы определить
победителя?
Почему канализационный люк
имеет форму круга ?
Что такое
алгоритм?
«Алгоритм — это конечный набор правил, который определяет
последовательность операций для решения конкретного множества задач и
обладает пятью важными чертами: конечность, определённость, ввод, вывод,
эффективность». (Д. Э. Кнут)

«Алгоритм — это всякая система вычислений, выполняемых по строго


определённым правилам, которая после какого-либо числа шагов заведомо
приводит к решению поставленной задачи». (А. Колмогоров)

«Алгоритм — это точное предписание, определяющее вычислительный


процесс, идущий от варьируемых исходных данных к искомому результату».
(А. Марков)

«Алгоритм — точное предписание о выполнении в определённом порядке


некоторой системы операций, ведущих к решению всех задач данного типа».
(Философский словарь / Под ред. М. М. Розенталя)

«Алгоритм — строго детерминированная последовательность действий,


описывающая процесс преобразования объекта из начального состояния в
конечное, записанная с помощью понятных исполнителю команд». (Николай
Дмитриевич Угринович, учебник «Информатика и информ. технологии»)

«Алгоритм — это последовательность действий, направленных на получение


определённого результата за конечное число шагов».
Что характеризует
любой алгоритм?

СЛОЖНОСТЬ
Оценка сложности алгоритмов
Виды сложностей:
• Временная сложность
• Пространственная сложность
• Асимптотическая сложность
О-нотация
Определение. Говорят, что функция f(n)
является O(g(n)), если существуют
такие постоянные с0 и n0, что
f(n) < c0g(n)
для всех n > n0.
Классы оценок сложности
- множества вычислительных проблем, для
решения которых известны алгоритмы,
схожие по сложности
 O(1) – постоянное время
 O(log(n)) – логарифмическое время
 O(n) – линейное время
 O(n log(n)) – "n-log-n" время
 O(n2) – квадратичное время
 O(n3) – кубическое время
 O(2n) – экспоненциальное время

19
Время выполнения алгоритма
для небольших n

20
Время выполнения алгоритма
для больших n

21
Пример
int max=a[0]; t1 – присваивание
for(int i=1;i<n;i++) t2 – итерация
if (max<a[i]) t3 – сравнение
max=a[i]; t4 - присваивание

f(n) = t1+ (t2+t3+t4)*(n-1) < (t1+ t2+t3+t4)*(n-1) <


< C*(n-1)<C*n =C*g(n), где g(n)=n
Таким образом f(n) ~ O(n)
Линейная сложность
Алгоритмические стратегии
• Алгоритмы полного перебора
• "Жадные" алгоритмы
• Алгоритмы "разделяй и властвуй"
• Перебор с возвратом
• Метод ветвей и границ
• Эвристики
Полный перебор
Полный перебор (или метод «грубой
силы» от англ. brute force) — метод
решения задачи путем перебора всех
возможных вариантов. Сложность полного
перебора зависит от количества всех
возможных решений задачи. Если
пространство решений очень велико, то
полный перебор может не дать
результатов в течение нескольких лет или
даже столетий.
Пример продолжительности
подбора паролей
Кол-во
Количество вариантов Время перебора
знаков
1 36 менее секунды
2 1296 менее секунды
3 46 656 менее секунды
4 1 679 616 17 секунд
5 60 466 176 10 минут
6 2 176 782 336 6 часов
7 78 364 164 096 9 дней
8 2,821 109 9x1012 11 месяцев
9 1,015 599 5x1014 32 года
10 3,656 158 4x1015 1 162 года
11 1,316 217 0x1017 41 823 года
12 4,738 381 3x1018 1 505 615 лет