45823 (665167), страница 3

Файл №665167 45823 (Двоичные деревья поиска) 3 страница45823 (665167) страница 32016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 3)

Удаление вершины немного сложнее добавления. Мы будем считать, что (NIL).color == BLACK, и будем считать операцию взятия цвета у указателя, равного NIL, допустимой операцией. Также мы будем считать допустимым присваивание (NIL).nodeParent, и будем считать данное присваивание имеющим результат. То есть при взятии значения (NIL).nodeParent мы получим ранее записанное значение. Функция RBTDelete подобна TreeDelete, но, удалив вершину, она вызывает процедуру RTBDeleteFixUp для восстановления свойств КЧД.

RBTDelete(Tree,node)

Begin

If (node.left == NIL) or (node.right == NIL) Then

nodeParent = node;

Else

nodeParent = TreeNext(node);

If (nodeParent.left != NIL) Then

nodeTemp = nodeParent.left;

Else

nodeTemp = nodeParent.right;

nodeTemp.nodeParent = nodeParent.nodeParent;

If (nodeTemp.nodeParent == NIL) Then

Tree.root = nodeTemp;

Else

Begin

If (nodeParent.nodeParent.left == nodeParent) Then

nodeParent.nodeParent.left = nodeTemp;

Else

nodeParent.nodeParent.right = nodeTemp;

End

If (nodeParent != node) Then

Begin

node.key = nodeParent.key;

node.color = nodeParent.color;

{ копирование дополнительных данных }

End

If (nodeParent.color == BLACK) Then

RBTDeleteFixUp(Tree,nodeTemp);

Return nodeParent;

End

Рассмотрим, как процедура RBTDeleteFixUp восстанавливает свойства КЧД. Очевидно, что если удалили красную вершину, то, поскольку оба ее потомка чёрные, красная вершина не станет родителем красного потомка. Если же удалили чёрную вершину, то как минимум на одном из путей от корня к листьям количество чёрных вершин уменьшилось. К тому же красная вершина могла стать потомком красного родителя.

1 RTBDeleteFixUp(Tree,node)

2 Begin

3 While (node != Tree.root) and (node.color == BLACK) Do

4 Begin

5 If (node == node.nodeParent.left)

6 Begin

7 nodeTemp = node.nodeParent.right;

8 If (nodeTemp.color == RED) Then

9 Begin

10 nodeTemp.color = BLACK;

11 nodeTemp.nodeParent.color = RED;

12 RBTLeftRotate(Tree,node.nodeParent);

13 nodeTemp = node.nodeParent.right;

14 End

15 If (nodeTemp.left.color == BLACK) and (nodeTemp.right.color == BLACK) Then

16 Begin

17 nodeTemp.color = RED;

18 nodeTemp = nodeTemp.nodeParent;

19 End

20 Else

21 Begin

22 If (nodeTemp.right.color == BLACK) Then

23 Begin

24 nodeTemp.left.color = BLACK;

25 nodeTemp.color = RED;

26 RBTRightRotate(Tree,nodeTemp)

27 nodeTemp = node.nodeParent.right;

28 End

29 nodeTemp.color = node.nodeParent.color;

30 node.color.nodeParent = BLACK;

31 nodeTemp.right.color = BLACK;

32 RBTLeftRotate(Tree,node.nodeParent);

33 node = Tree.root;

34 End

35 End

36 Else

37 Begin

38 nodeTemp = node.nodeParent.left;

39 If (nodeTemp.color == RED) Then

40 Begin

41 nodeTemp.color = BLACK;

42 nodeTemp.nodeParent.color = RED;

43 RBTRightRotate(Tree,node.nodeParent);

44 nodeTemp = node.nodeParent.left;

45 End

46 If (nodeTemp.right.color == BLACK) and (nodeTemp.left.color == BLACK) Then

47 Begin

48 nodeTemp.color = RED;

49 nodeTemp = nodeTemp.nodeParent;

50 End

51 Else

52 Begin

53 If (nodeTemp.left.color == BLACK) Then

54 Begin

55 nodeTemp.right.color = BLACK;

56 nodeTemp.color = RED;

57 RBTLeftRotate(Tree,nodeTemp)

58 nodeTemp = node.nodeParent.left;

59 End

60 nodeTemp.color = node.nodeParent.color;

61 node.color.nodeParent = BLACK;

62 nodeTemp.left.color = BLACK;

63 RBTRightRotate(Tree,node.nodeParent);

64 node = Tree.root;

65 End

66 End

67 End

68 node.color = BLACK;

69 End

Процедура RBTDeleteFixUp применяется к дереву, которое обладает свойствами КЧД, если учесть дополнительную единицу черноты в вершине node (она теперь дважды чёрная, это чисто логическое понятие, и оно нигде фактически не сохраняется и логического типа для хранения цвета вам всегда будет достаточно) и превращает его в настоящее КЧД.

Что такое дважды чёрная вершина? Это определение может запутать. Формально вершина называется дважды чёрной, дабы отразить тот факт, что при подсчёте чёрных вершин на пути от корня до листа эта вершина считается за две черных. Если чёрная вершина была удалена, её черноту так просто выкидывать нельзя. Она на счету. Поэтому временно черноту удалённой вершины передали вершине node. В задачу процедуры RBTDeleteFixUp входит распределение этой лишней черноты. Они или будет передана красной вершине (и та станет чёрной) или после перестановок других чёрных вершин (дабы изменить их количество на пути от корня к листьям) будет просто выкинута.

В цикле (строки 3-67) дерево изменяется, и значение переменной node тоже изменяется, но сформулированное свойство остаётся верным. Цикл завершается, если:

node указывает на красную вершину, тогда мы красим её в чёрный цвет (строка 68).

node указывает на корень дерева, тогда лишняя чернота может быть просто удалена.

Могло оказаться, что внутри тела цикла удается выполнить несколько вращений и перекрасить несколько вершин, так что дважды чёрная вершина исчезает. В этом случае присваивание node = Tree.root (строки 33 и 64) позволяет выйти из цикла.

Внутри цикла node указывает на дважды чёрную вершину, а nodeTemp – на её брата (другую вершину с тем же родителем). Поскольку вершина node дважды чёрная, nodeTemp не может быть NIL, поскольку в этом случае вдоль одного пути от node.nodeParent было бы больше чёрных вершин, чем вдоль другого. Четыре возможных случая показаны на рисунке ниже. Зелёным и синим, помечены вершины, цвет которых не играет роли, то есть может быть как черным, так и красным, но сохраняется в процессе преобразований.

Рисунок 8

Убедитесь, что преобразования не нарушают свойство 4 КЧД (помните, что вершина node считается за две чёрные, и что в поддеревьях a - f изначально не равное количество чёрных вершин).

Случай 1 (строки 9-14 и 40-45) имеет место, когда вершина nodeTemp красная (в этом случае node.nodeParent чёрная). Так как оба потомка вершины nodeTemp чёрные мы можем поменять цвета nodeTemp и node.nodeParent и произвести левое вращение вокруг node.nodeParent не нарушая свойств КЧД. Вершина node остается дважды чёрной, а её новый брат – чёрным, так что мы свели дело к одному из случаев 2-4.

Случай 2 (строки 16-19 и 47-50). Вершина nodeTemp – чёрная, и оба её потомка тоже чёрные. В этом случае мы можем снять лишнюю чёрноту с node (теперь она единожды чёрная), перекрасить nodeTemp, сделав ёё красной (оба её потомка чёрные, так что это допустимо) и добавить черноту родителю node. Заметим, что если мы попали в случай 2 из случая 1, то вершина node.nodeParent – красная. Сделав её чёрной (добавление чёрного к красной вершине делает её чёрной), мы завершим цикл.

Случай 3 (строки 23 – 28 и 53 - 59) Вершина nodeTemp чёрная, её левый потомок красный, а правый чёрный. Мы можем поменять цвета nodeTemp и её левого потомка и потом применить правое вращение так, что свойства КЧД будут сохранены. Новым братом node будет теперь чёрная вершина с красным правым потомком, и случай 3 сводится к случаю четыре.

Случай 4 (строки 29 – 33 и 60 - 64) Вершина nodeTemp чёрная, правый потомок красный. Меняя некоторые цвета (не все из них нам известны, но это нам не мешает) и, производя левое вращение вокруг node.nodeParent, мы можем удалить лишнюю черноту у node, не нарушая свойств КЧД. присваивание node = Tree.root выводит нас из цикла.

Сравнительные характеристики скорости работы различных структур данных

Чтобы всё сказанное до этого не казалось пустой болтовнёй, я в качестве заключения приведу сравнительные характеристики скорости работы различных структур данных (деревьев и массивов). Для измерения времени была использована функция WinAPI QueryPerfomanceCounter. Время пересчитано в микросекунды. В скобках приведена конечная глубина дерева. Тестирование проводилось на процессоре Intel Celeron Tualatin 1000MHz с 384Мб оперативной памяти. В качестве ключа использовалось число типа int (32-х битное целое со знаком), а в качестве данных число типа float (4-х байтное вещественное).

Количество элементов

ДДП

КЧД

Постоянно сортированный массив

Несортированный массив

Массив с постсортировкой

1000

4943

(1000)

535

(17)

193

32

73

2000

20571

(2000)

1127

(19)

402

89

152

3000

65819

(3000)

1856

(20)

621

98

305

4000

82321

(4000)

2601

(21)

862

189

327

5000

126941

(5000)

3328

(22)

1153

192

461

6000

183554

(6000)

4184

(22)

1391

363

652

7000

255561

(7000)

4880

(23)

1641

452

789

8000

501360

(8000)

5479

(23)

1905

567

874

9000

1113230

(9000)

6253

(24)

2154

590

1059

10000

1871090

(10000)

7174

(24)

2419

662

1180

Таблица 1. Добавление элемента (возрастающие ключи)

Количество элементов

ДДП

КЧД

Постоянно

сортированный массив

Несортированный массив

Массив с постсортировкой

1000

4243

108

136

1354

134

2000

19295

250

289

5401

286

3000

71271

391

448

25373

441

4000

79819

560

615

23861

607

5000

124468

759

787

38862

776

6000

180029

956

954

55303

941

7000

246745

1199

1165

75570

1111

8000

487187

1412

1307

98729

1330

9000

1062128

1906

1494

134470

1474

10000

1807235

2068

1719

154774

1688

Таблица 2. Поиск элемента (возрастающие ключи).

Количество элементов

ДДП

КЧД

Постоянно сортированный массив

Несортированный массив

Массив с постсортировкой

1000

308

419

2077

2047

2080

2000

639

876

13422

8046

8179

3000

1001

1372

25092

30902

18407

4000

1380

1831

32572

32473

32651

5000

1680

2286

50846

51001

50962

6000

2105

2891

73321

73114

73202

7000

2569

3514

99578

100059

99801

8000

3025

4384

129833

129897

130054

9000

3484

5033

164846

194361

164264

10000

4050

5690

203207

202979

202738

Таблица 3. Удаление элемента по ключу (возрастающие ключи).

Количество элементов

ДДП

КЧД

Постоянно сортированный массив

Несортированный массив

Массив с постсортировкой

1000

547

(25)

548

(13)

1800

34

362

2000

1133

(25)

1171

(14)

5534

70

734

3000

1723

(28)

1905

(14)

12065

150

1174

4000

2891

(28)

2985

(15)

20867

223

1626

5000

3604

(28)

4024

(15)

32927

248

1962

6000

4336

(29)

4970

(15)

44720

373

2537

7000

5196

(29)

5794

(16)

60723

443

2977

8000

6051

(30)

6972

(16)

77482

511

3485

9000

6994

(30)

7519

(16)

104219

590

3821

10000

9544

(31)

10303

(16)

118760

584

4408

Таблица 4. Добавление элемента (случайные ключи)

Количество элементов

ДДП

КЧД

Постоянно сортированный массив

Несортированный массив

Массив с постсортировкой

1000

181

136

159

1354

155

2000

406

307

347

5412

339

3000

653

494

551

12927

538

4000

925

702

765

23936

747

5000

1223

949

1024

37861

962

6000

1532

1142

1216

55124

1185

7000

1893

1494

1453

75628

1403

8000

2477

1833

1679

98802

1631

9000

2943

2390

1994

125570

1858

10000

3395

2937

2228

154791

2108

Таблица 5. Поиск элемента (случайные ключи)

Количество элементов

ДДП

КЧД

Постоянно сортированный массив

Несортированный массив

Массив с постсортировкой

1000

469

517

1149

2014

1195

2000

995

1079

4381

8054

4387

3000

1557

1756

9673

18191

9639

4000

2272

2424

17071

32451

17105

5000

3070

3019

27380

50665

26954

6000

3528

3618

39294

72996

39227

7000

4322

4542

53255

99402

53309

8000

5299

5531

71406

129964

70766

9000

6180

6553

89583

164943

89935

10000

7527

7797

112190

202993

111439

Таблица 6. Удаление элемента по ключу (случайные ключи)

Характеристики

Тип файла
Документ
Размер
3,08 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6543
Авторов
на СтудИзбе
300
Средний доход
с одного платного файла
Обучение Подробнее