2.Алгоритмы сортировки
Вход: массив элементов (a1,…,an), принадлежащих некоторому вполне упорядоченному множеству S
Выход: перестановка этих элементов (b1,…,bn) такая, что bi£bi+1, i=1,…,n-1.
Сортировка вставками
Идея: на i-м каждом шаге элемент ai вставляется на свое место в уже отсортированный подмассив (a1,…,ai-1)
for (i=2; i£n; i++)
{
curr = a[i];
j = i-1;
while ((j>0) && (a[j] > curr))
{
a[j+1] = a[j];
j--;
}
a[j+1] = curr;
}
На i-м шаге в худшем случае выполняется С*(i-1) операций
T = C + 2C +…+C(n-1) = Cn(n-1)/2 = O(n(n-1)/2)
Трудоемкость в среднем - O(n(n-1)/4).
Дерево алгоритма сортировки:
1)Внутренние вершины получают метки (i,j). Такая
вершина соответствует операции сравнения элементов
ai и aj. Корень соответствует самой первой операции
сравнения.
2) Каждый лист соответствует результату работы
алгоритма и получает пометку (b1,…,bn), где (b1,…,bn) –
пересатновка элементов массива, получившаяся в
результате выполнения алгоритма.
3) Каждое ребро получает метку £ или > в соответствии
с результатом выполнения операции сравнения в
вершине, из которой это ребро выходит
Трудоемкость в худшем случае – длина самого длинного
пути из корня дерева в его лист (высота дерева)
Лемма. Пусть высота дерева c L листьями равна h. Тогда L£2h.
В дереве алгоритма число листьев равно n!. L = n! £ 2h
Метод “разделяй и властвуй”
1. Разделение задачи на несколько подзадач
2. Решение этих подзадач (например, рекурсивно)
3. Комбинирование решений подзадач и получение из них решения исходной задачи
QuickSort
Пусть A[p…r] = (ap,…,ar) A=A[1…n]
1.Переупорядочеваем подмассив A[p…r] таким образом, чтобы существовал qÎ [p,r] такой, что для любого iÎ [p,q-1] ai£aq и для любого jÎ [q+1,r] aq£aj
Quicksort(A,p,r)
{
if (p < r)
{
q = Findq(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
Quicksort(A,1,n)
x = A[r]; q = p;
for (i=p; i<=r;i++)
{
if (A[i]<=x)
{
swap(A[i],A[q]);
q++;
}
}
Трудоемкость процедуры Findq - Cm = O(m), где m=r-p
2.Cортируем подмассивы A[p…q-1] и A[q+1…r]
Худшая трудоемкость у алгоритма QuickSort будет тогда, когда на каждом шаге Findq будет генерировать разбиение массива A[p…r] на подмассивы из 1 элемента и m-1 элемента
Трудоемкость в худшем – T(n) = Cn + C + T(n-1) = O(n2)
В лучшем случае разбивает массив на 2 подмассива примерно равной длины. Тогда T(n) = Cn + 2T(n/2)
Лемма. Решение этого рекуррентного уравнения – O(nlogn)
Сортировка подсчетом
T(n) = O(maxi=1,…,n(a[i])*n)
- 1.Трудоемкость алгоритмов
- 2.Алгоритмы сортировки
- 3.Сортировка слиянием
- 4.Бинарные поисковые деревья
- 5.2-3-4 Деревья
- 6.Хеширование
- 7. Поиск подстроки. Алгоритм Кнута-Морриса- Пратта.
- 8. Графы. Структуры данных для представления графов
- 9. Алгоритм нахождения Эйлерова цикла
- 10 .Поиск в ширину(волновой алгоритм)
- 11.Поиск в глубину
- 12.Жадные алгоритмы и матроиды
- 13.Задача об остовном дереве. Алгоритмы Прима и Краскала, их реализация
- 14. Алгоритм Дийкстры
- 15. Алгоритм Флойда
- 16. Паросочетания в двудольных графах
- 17. Потоки и разрезы в сетях. Алгоритм Форда-Фалкерсона
- 18. Задача о рюкзаке
- 21. Классы p и np. Полиномиальное сведение.
- 22. Np- полные задачи. Теорема Кука-Карпа-Левина. Np-полнота задачи о клике
- 23. Алгоритмы с гарантированной оценкой точности. Задача упаковки
- 24.Метод локального поиска и поиска с запретами. Задача о максимальном разрезе.
- 25.Метод ветвей и границ. Задача коммивояжера.
- 26. Задача коммивояжера с неравенством треугольника. Алгоритм Кристофидеса
- 27.Задача о независимом множестве, точные и эвристические алгоритмы ее решения
- 28.Задача о раскраске графа, точные и эвристические алгоритмы ее решения.
- 31.Задача о раскраске хордальных графов
- 32.Генетические алгоритмы
- 33. Page Rank
- 34 Криптосистема с открытым ключом. Криптосистема rsa
- 35.Задача разделения секрета.
- 36. Алгоритмы сжатия информации