
- •27. Составной оператор (блок). Условный оператор. Оператор перехода goto и помеченный оператор. Оператор цикла с параметром (оператор for)
- •28. Оператор цикла с предусловием (оператор while). Оператор цикла с постусловием (оператор repeat). Оператор варианта (оператор case).
- •29. Функции и процедуры в псевдокодах
- •30.Бинарное дерево поиска. Сортировка элементов, хранящихся в бинарном дереве поиска.
- •31. Оператор проверки принадлежности элемента множеству. Оператор вставки элемента в бинарное дерево поиска.
- •32.Оператор удаления элемента из бинарного дерева
- •33. Оценка эффективности алгоритмов на бинарном дереве поиска.
- •34. Частично упорядоченные деревья – основные понятия. Оператор удаления наиболее приоритетного элемента из частично упорядоченного двоичного дерева.
- •35. Оператор вставки элемента в частично упорядоченное дерево.
- •36. Реализация частично упорядоченного двоичного дерева двоичной кучей.
- •37. Нагруженные деревья – основные понятия. Реализации узлов нагруженного дерева (атд treenode). Основные операторы для атд treenode.
- •38. Реализация нагруженного дерева (атд tree). Структура программы для проверки орфографии с помощью нагруженного дерева.
- •39. Структура 2-3 дерева. Поиск записи с заданным ключом в 2-3 дереве.
- •40. Вставка элемента в 2-3 дерево.
- •41. Удаление элемента из 2-3 дерева
- •42. Остовные деревья минимальной стоимости (одмс) – основные понятия. Основное свойство одмс (с доказательством).
- •43. Алгоритм Прима построения одмс.
- •44. Понятие задачи коммивояжера. Жадный алгоритм для приближенного решения задачи коммивояжера.
- •45. Задача коммивояжера для полного графа с неравенством треугольника. Основные шаги алгоритма решения задачи. Утверждение 5.1 максимально погрешности алгоритма.
33. Оценка эффективности алгоритмов на бинарном дереве поиска.
Рассмотрим 2 случая:
1-й пусть бинарное дерево полное, тогда не существует пути содержащего более 1+log2(n) при движении от корня к любому листу => операторы INSERT, MEMBER, DELETE, DELETEMIN имеют время выполнения порядка О(log2(n)), это означает, что если n будет расти, то время будет расти пропорционально log n.
2-й крайний случай соответствует, когда при заполнении дерева элементы поступаю, например, в порядке возрастания, тогда дерево вырождается в цепочку. В том случае оператор указывает выше время выполнения (в худшем случае О(n)). При заполнении такого дерева на вставку потребуется время такого порядка О(i), а все действия при заполнении n элементами:
=
(n*(n+1))/2
=> О(n2)
Рассмотрим «средний случай», когда элементы поступают в хранилище в случайном порядке, а точнее при заданном исходном множестве n элементов.
Рассмотрим каков в этом случае порядок времени выполнения основных операторов, введем функцию, аргументы которой являются количеством n элементов в хранилище P(n), возвращая среднее число узлов, которое нужно пройти двигаясь от корня дт какого-то листа.
Составим рекурсивное выражение для функции P(n). Если дерево пустое, то P(0) = 0, если n=1, то Р(1) = 1. Пусть есть n≥2, и пусть 1-м на выход будет элемент «а». Если исходный список отсортировать, то «а» может оказаться на любом месте. Пусть в упорядоченном списке i<a элементов и соответственно (n-i-1)>a, тогда при построении дерева в корне будет элемент «а», т.к он первый перешел, i – потомки левого сына, а (n-i-1) элементов – потомки правого сына.
Рис. 4.6
Будем считать, что «а» с равной вероятностью может оказаться на любом месте в упорядоченном списке, т.к любая последовательность i меньших элементов и (n-i-1) больших элементов равновероятны, то среднюю длину путей и в левом, и в правым поддеревьях. Если вершина к исходному дереву, то вычисляя пути от «а» к любому листу мы значениям P(i) и P(n-i-1) должны добавить 1.
P(i)+1 в левой части на рис. 4.6 средняя длина P(i)+1, а в правой P(n-i-1)+1. Отсюда среднюю P(n) можно представить как среднее значение в левой и правой частях дерева рис. 4.6 i/n(P(i)+1)+((n-i-1)/n)*(P(n-i-1)+1). Чтобы окончательно получить среднее значение мы должны передать все n от 0 до (n-1). И мы получим:
P(n)
=
(-//-//-//-) (4.1)
Возьмем вторую часть суммы из 4.1 и запишем ее отдельно
i → n-i-1 результате вся правая часть выражения 4.1 примет вид:
P(n)
≤ 1+2/n^2(4.2)
Выполнится следующее неравенство:
P(n)≤(1+4log2(n))
n=1
Т.к P(1)=1
n=2 тоже справедливо P(2)=2≤(1+4log22)=5.
Предположим,
что утверждение выполняется для всех
i<n,
тогда вместо P(i)в
формулу 4.2 получим P(n)≤1+(2/n^2).
Учтем, что
=> 2/n^2
,
то придем к соотношениюP(n)≤2+(8/n^2)
(4.3)
Разобьем (4.3) на 2-ве суммы в т. i=[n/2], тогда в 1-й сумме слагаемые не будут превышать i*log2(n/2), а во 2-й i*log2(n). В результате получим:
P(n)≤2+(8/n^2)*((4.4)
При любом четном n 1-я сумма из 4.4 не превышает величины (n^2/8)*log2(n/2)=(n^2/8)*log2(n)-(n^2/8). 2-я сумма не будет превышать:
(3*n^2/8)*log2(n) => по индукции получим нужное нам соотношение:
P(n)≤2+(8/n^2((n^2/2)*log2(n))-(n^2/8)=1+4*log2(n) (4.5)
Т.о доказано, что в дереве двоичного поиска, которое получилось путем случайной вставки n элементов средняя длина пути от корня до любого лисьа по произвольному пути имеющем порядок О(log2(n)),
Более тонкий анализ позволяет указать, что в формуле 4.5 коэффициенты можно заменить на 1.4.
На основе полученного результата можем утверждать, что в среднем время выполнения проверки на принадлежность данного оператора к дереву будет иметь порядок O(log2(n)), аналогичный порядок будет иметь оператор INSERT, DELETE и DELETEMIN.