¨ Для червоно-чорних дерев у кожному вузлі потрібно зберігати посилання на лівого й правого нащадка, а також посилання на предка. Крім того, десь потрібно зберігати й кольори вузла! Хоча на кольори достатній тільки один біт, через вирівнювання структур, необхідного для ефективності доступу, як правило, буде витрачено більше місця. Таким чином, кожний вузол червоно-чорного дерева вимагає пам'яті, якої вистачило б на 3-4 покажчика.
¨ Для розділених списків у кожному вузлі є посилання нульового рівня. Імовірність мати посилання рівня 1 дорівнює S. Імовірність мати посилання рівня 2 дорівнює j. Загалом, кількість посилань на вузол дорівнює
метод |
оператори |
середній час |
час у найгіршому разі |
хеш-таблицы |
26 |
O(1) |
O(n) |
незбалансовані дерева |
41 |
O(lg n) |
O(n) |
червоно-чорні дерева |
120 |
O(lg n) |
O(lg n) |
розділені списки |
55 |
O(lg n) |
O(n) |
Таблиця 0.2: Порівняння алгоритмів ведення словників
У таблиці 3.3 наведені часи, вимагаємоые для вставки, пошуку й видалення 65536 (216) випадкових елементів. У цих експериментах розмір хеш-таблицы рівнявся10009, для розділених списків допускалося до 16 рівнів посилань. Звичайно, у реальних ситуаціях часи можуть відрізнятися від наведених тут, однак, таблиця дає досить інформації для вибору підходящого алгоритму.
метод |
вставка |
пошук |
видалення |
хеш-таблицы |
18 |
8 |
10 |
незбалансовані дерева |
37 |
17 |
26 |
червоно-чорні дерева |
40 |
16 |
37 |
розділені списки |
48 |
31 |
35 |
Таблиця 0.3: Середній час (мсек) для 65536 випадкових елементів
У таблиці 3.4 наведені середні часи пошуку для двох випадків: випадкових даних, і впорядкованих, значення яких надходили в зростаючому порядку. Упорядковані дані є найгіршим випадком для незбалансованих дерев, оскільки дерево вироджується у звичайний однозв'язний список. Наведено часи для “одиночного” пошуку. Якби нам знадобилося знайти всі 65536 елементів, то красно-черныму дереву знадобилося б 6 секунд, а незбалансованому - близько 1 години.
Елементів |
хеш-таблицы |
незбалансовані дерева |
червоно-чорні дерева |
розділені списки |
|
16 |
4 |
3 |
2 |
5 |
|
випадкові |
256 |
3 |
4 |
4 |
9 |
дані |
4,096 |
3 |
7 |
6 |
12 |
65,536 |
8 |
17 |
16 |
31 |
|
16 |
3 |
4 |
2 |
4 |
|
упорядковані |
256 |
3 |
47 |
4 |
7 |
дані |
4,096 |
3 |
1,033 |
6 |
11 |
65,536 |
7 |
55,019 |
9 |
15 |
Таблиця 0.4: Середній час пошуку (мсек)
typedef int T; /* type of item to be sorted */
typedef int tblIndex; /* type of subscript */
#define compGT(a,b) (a > b)
void insertSort(T *a, tblIndex lb, tblIndex ub) {
T t;
tblIndex i, j;
/**************************
* sort array a[lb..ub] *
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.