Учебные материалы (Практические занятия, контрольные задания, конспект лекций) / Практические занятия / Практическое занятие 6
.docПРАКТИЧЕСКОЕ ЗАНЯТИЕ №4.
“Сложность вычислительных процедур”
Введение. Рассмотрим задачу сортировки (упорядочения) чисел:
Пусть дан список чисел: [1,6,8,3,4,2]. Требуется расположить эти числа в порядке неубывания (возрастания). Собственно, сам алгоритм вовсе не обязан быть оптимальным и служит лишь целям иллюстрации. Наш алгоритм будет таким.
-
Найти минимальное число в списке и поставить его на первое место.
-
Все полученные к данному моменту минимальные числа далее в процессе сортировки не участвуют.
-
Повторять шаги 1,2, пока не останется не отсортированных чисел.
Чтобы оценить сложность этой процедуры, заметим, что при поиске очередного минимального числа из n чисел мы производим (n-1) сравнение. Пусть в исходном списке N чисел. Тогда мы последовательно произведем число сравнений, равное (N-1)+(N-2)+(N-3)+…+ 2=N*(N-1)-(1+2+3+…+N-1)=N*(N-1)-(N-1)*(N-2)/2= (N-1)*(N-(N-2)/2) =O(N2).
Обозначение O(N2) указывает, что мы имеем дело с функцией одного порядка что и N2 .
Определение. Размером задачи называется число ячеек, необходимое для записи задачи на ленте машины Тьюринга.
Разумеется, можно использовать различные системы кодировки. Этот вопрос нас пока не будет интересовать.
В рассмотренной задаче о сортировке списка размер задачи равен числу элементов списка – N.
Определение. Вычислительной сложностью алгоритма называется функция, сопоставляющая размеру задачи N число тактов машины Тьюринга до получения ответа.
Определение. Алгоритм называется эффективным с вычислительной точки зрения, если и только если его вычислительная сложность есть некоторый полином от размера задачи.
Мы видим, что приведенный выше алгоритм сортировки является эффективным с вычислительной точки зрения.
Дадим пример неэффективного алгоритма. Пусть даны символы
+, 6, -, =, 5,8,7
Спрашивается, можно ли разместить эти символы последовательно так, чтобы получилось верное арифметическое равенство?
Очевидно, простейший алгоритм будет просто перебирать все варианты, пока не найдет что-нибудь типа такого:
6-5+7=8.
Здесь N=7. Но сколько же варbантов переберет алгоритм? Очевидно, в среднем 0.5*N!
Здесь N! читается как N- факториал и вычисляется по формуле
N!= N*(N-1)*(N-2)*(N-3)*…*2*1.
Теорема. N! имеет порядок, не сравнимый ни с одним полиномом от N.
Доказательство. Пусть это не так и пусть k –порядок некоторого полинома сравнимого с N!. Тогда, согласно математическому представлению сравнимости имеем
LimN N!/Nk не существует. В самом деле, возьмем логарифм от N!/Nk : Ln(N!/Nk)=
N+(N-1)+(N-2)+…+1- N*k=O(N2)-N*k. Поскольку N стремится к бесконечности, то никакое целое k не может обеспечить сравнимости O(N2)-N*k и, следовательно, предела нет.
Полученный результат в математике известен как проклятие размерности, а алгоритмы подобного типа называются экспоненциальными (что является эквивалентном неэффективности). Для некоторых задач до настоящего времени так и не нашли эффективных алгоритмов. К числу таких задач относится задача ВЫПОЛНИМОСТЬ.
Задания.
-
Разработайте алгоритм для определения того, является ли число N простым или составным.
(Идея – последовательно делить N на 2,3,4,5,6,7…, N0.5 ). Какова сложность такого алгоритма?
1+2+3+…+ N0.5= N0.5*(N0.5-1)*0.5.
Из этого следует, что число делений растет приблизительно как функция порядка N. Однако хитрость в том, что для представления N нужна запись размера m порядка logN, т.е. m= logN. Вычислительная сложность определяется как функция от размера записи задачи. В нашем случае получаем оценку вычислительной сложности в виде
N0.5*(N0.5-1)*0.5= (10m) 0.5*((10m)0.5-1)*0.5 . Эта функция имеет порядок 10m и заведомо превосходит любой полином от m.
-
Доказать, что 10m имеет порядок, не сравнимый ни с каким полиномом от m при m бесконечность.
-
Разработайте алгоритм для определения того, содержится ли данная подстрока в строке. Например, строка есть aaabbbcccabcaccbaccb а подстрока – cba. В данном случае вхождение имеет место. Вопрос: каков размер задачи в этом случае, как он определяется? (ответ – как сумма размеров строки и подстроки). Придумайте алгоритм и укажите его сложность.
-
Пусть дана схема соединения городов дорогами. Нарисуйте какую-нибудь собственную схему, причем город будет отображаться кружком, а дорога – отрезком, соединяющим два города. Пусть у вас будет 6-8 городов и 10-12 дорог (порядок проводки которых определите самостоятельно). Разработайте алгоритм и оцените его сложность, с помощью которого можно найти путь из одного города в другой.
-
Пусть имеются замены для букв
-
b
-
c
-
d
-
a
С помощью этих замен можно из слова aabd получить слово сссс. Для этого мы используем следующую схему
aabd -> bbbd -> ccca -> cccb -> cccc
Ситуация усложнится, если для одной букцвы использовать несколько подстановок, например,
a -b
a -e
b-c
b-a
c-d
d-a
e-b
Например, теперь из aaa можно вывести dba.
Разработайте алгоритм, который на входе получает два слова и правила замены букв. Вопрос: можно ли из первого слова получить второе с помощью данной системы подстановок. Какова сложность такого алгоритма?