- •Введение
- •1. Технология проектирования и реализации коллекций данных.
- •1.1. Постановка задачи.
- •1.2. Разработка структур данных и алгоритмов
- •1.3. Кодирование
- •1.4. Отладка и тестирование
- •1.5. Сопровождение
- •2. Лабораторная работа «Сортировка коллекции»
- •2.1. Алгоритмы внутренней сортировки
- •2.2. Задание к лабораторной работе
- •2.1.1. Варианты заданий
- •2.1.2. Методические указания к выполнению задания
- •2.3. Контрольные вопросы и упражнения.
- •3. Лабораторная работа «Коллекция данных - список».
- •3.1. Структуры списков
- •3.2. Задание к лабораторной работе
- •3.2.1. Варианты заданий:
- •3.2.2. Методические указания к выполнению задания
- •3.3. Контрольные вопросы и упражнения.
- •4. Лабораторная работа «Коллекция данных - дерево поиска».
- •4.1. Структуры bst - деревьев
- •4.2. Задание к лабораторной работе
- •4.2.1. Варианты задания
- •4.2.2. Методические указания к выполнению задания:
- •4.3. Контрольные вопросы и упражнения.
- •5. Лабораторная работа «Коллекция данных - сбалансированное дерево поиска»
- •5.1. Структуры сбалансированных деревьев
- •5.2. Задание к лабораторной работе
- •5.2.1. Варианты заданий:
- •5.2.2. Методические указания к выполнению задания
- •5.3. Контрольные вопросы и упражнения.
- •6. Лабораторная работа «Коллекция данных - хеш – таблица»
- •6.1. Функции хеширования
- •6.2. Разрешение коллизий и структуры хеш-таблиц
- •6.3. Трудоёмкость операций
- •6.4. Задание к лабораторной работе
- •6.4.1. Варианты заданий:
- •6.4.2. Методические указания к выполнению задания
- •6.5. Контрольные вопросы и упражнения.
- •Литература
- •Приложение a: Псевдокод. Основные правила и соглашения псевдокода
- •Алгоритм сортировки Шелла
- •Алгоритм пирамидальной сортировки
- •Рекурсивный алгоритм сортировки разделением
- •Итеративный алгоритм сортировки разделением
- •Рекурсивный алгоритм сортировки слиянием
- •Итеративный алгоритм сортировки слиянием
- •Рекурсивный алгоритм поразрядной msd-сортировки
- •Итеративный алгоритм поразрядной lsd-сортировки
- •Итеративный алгоритм вставки элемента в bst – дерево
- •Рекурсивный алгоритм удаления элемента из bst – дерева
- •Алгоритм вставки элемента в корень bst – дерева
- •Алгоритм поиска предыдущего по значению ключа узла bst – дерева
- •Алгоритм поиска k –го по значению ключа узла в bst – дереве
- •Алгоритм разбиения дерева на части
- •Алгоритм удаления из bst-дерева на основе объединения поддеревьев
- •Алгоритм объединения bst – деревьев
- •Алгоритм удаления элемента из рандомизированного дерева
- •Алгоритм вставки элемента в avl-дерево
- •Рекурсивный алгоритм вставки элемента в rb – дерево
- •Итеративный алгоритм вставки элемента в rb – дерево
- •Итеративный алгоритм удаления элемента из rb – дерева
- •Алгоритм вставки элемента в 2-3 - дерево
- •Алгоритм удаления элемента из 2-3 - дерева
- •Приложение д Алгоритмы операций для хеш-таблицы с открытой адресацией Алгоритм вставки элемента
- •Алгоритм удаления элемента
- •Алгоритм поиска элемента
Алгоритм удаления элемента из рандомизированного дерева
RND_Delete(t, k, deleted)
1 t – корень дерева или поддерева
2 k – значение удаляемого ключа
3 deleted – возвращаемый признак удаления
4 if t = nil
5 then deleted ← FALSE
6 return t
7 if k < key[t]
8 then left[t] ← RND_Delete (left[t], k, del)
9 else if k > key[t]
10 then right[t] ← RND_Delete (right[t], k, del)
11 else if Rand()/(Rand_MAX/(n[left[t]]+ n[right[t]]+1)) < n[left[t]]
12 then x ← RND_Join (left[t], right[t])
13 else x ← RND_Join (right[t], left[t])
14 Delete_Node (t)
15 t ← x
16 del ← TRUE
17 deleted ← del
18 if deleted = TRUE
19 then Calc_n(t)
20 return t
RND_Join (a, b)
1 if a = 0
2 then return b
3 if b = 0
4 then return a
5 left ← left[a]
6 right ← right[a]
7 left[a] ← right[a] ← nil
8 n[b] ← n[b]+n[a]
9 n[a] ← 1
10 b ← Root_Insert (b, a)
11 left[b] ← RND_Join (left, left[b])
12 right[b] ← RND_Join (right, right[b])
13 return b
Алгоритм вставки элемента в avl-дерево
AVL_Insert(t, k, data, h, inserted)
1 t – корень дерева / поддерева
2 k –ключ нового элемента
3 data – данные нового элемента
3 iserted – возвращаемый признак вставки
4 h – возвращаемый признак увеличения высоты
5 h ← FALSE
6 if1 k = key[t]
7 then1 inserted ← FALSE
8 return t
9 if2 t = nil
10 then2 t ← Create_Node(k, data)
11 bal[t] ← 0
12 h ← TRUE
13 inserted ← TRUE
14 return t
15 if3 k < key[t]
16 then3 left[t] ← AVL_Insert(left[t], k, data, hh, ins)
17 if4 hh = TRUE
18 then4выросла левая ветвь
19 if5 bal[t] = 1
20 then5 bal[t] ← 0
21 else5 if6 bal[t] = 0
22 then6 bal[t] ← -1
23 h ← TRUE
24 балансировка
25 else6 if7 bal[left[t]] = -1
26 then7 t ← R (t)
27 else7 t ← LR (t)
28 else3 right[t] ← AVL_Insert(right[t], k, data, hh, ins)
29 if8 hh = TRUE
30 then8 выросла правая ветвь
31 if9 bal[t] = -1
32 then9 bal[t] ← 0
33 else9 if10 bal[t] = 0
34 then10 bal[t] ← 1
35 h ← TRUE
36 балансировка
37 else10 if11 bal[right[t]] = 1
38 then11 t ← L (t)
39 else11 t ← RL (t)
40 inserted ← ins
41 return t
R (t)
1 x← left[t]
2 left[t] ← right[x]
3 right[x] ← t
4 bal[x] ← bal[t] ← 0
5 return x
LR (t)
1 x ← left[t]
2 y ← right[x]
3 right[x] ← left[y]
4 left[y] ← x
5 left[t] ← right[y]
6 right[y] ← t
7 if bal[y] =-1
8 then bal[t] ← 1
9 else bal[t] ← 0
10 if bal[y] = 1
11 then bal[x] ← -1
12 else bal[x] ← 0
13 bal[y] ← 0
14 return y