МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №4
по дисциплине «Алгоритмы и структуры данных»
Тема: «Деревья двоичного поиска (АВЛ дерево)»
Вариант №42
Студенты гр. 6307 |
|
Лазарев С.О. Медведев Е.Р. |
Преподаватель |
|
Колинько П.Г. |
Санкт-Петербург
2018
Y
ЦЕЛЬ 3
ЗАДАНИЕ 3
АВЛ дерево 4
Временная сложность 5
ВЫВОДЫ 6
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 7
ПРИЛОЖЕНИЕ 8
СОДЕРЖА
ЗАДАНИЕ 3
ВЫВОДЫ 13
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14
ПРИЛОЖЕНИЕ 15
ЦЕЛЬ 3
ЗАДАНИЕ 3
АВЛ дерево 4
Временная сложность 5
ВЫВОДЫ 6
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 7
ПРИЛОЖЕНИЕ 8
ЦЕЛЬ
Получить практические навыки по работе с ДДП, а именно с АВЛ деревом.
ЗАДАНИЕ
Составить и отладить программу для вычисления шестого множества по пяти заданным, представленным в форме АВЛ деревьев.
F = (A & B) \ (C & D) ^ E.
АВЛ дерево
Сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота ее двух поддеревьев различается не более чем на 1.
Пример:
Рис 1. Дерево А.
Рис. 2 Дерево В.
Рис 3. Дерево С.
Рис 4. Дерево D.
Рис 5. Дерево E.
Рис 6. Дерево – результат F.
Временная сложность
Таблица 1. Временная сложность
|
В среднем |
В худшем случае |
Расход памяти |
O(n) |
O(n) |
Поиск |
O(log n) |
O(log n) |
Вставка |
O(log n) |
O(log n) |
XOR |
O(n*log(n)) |
- |
& |
O(n*log(n)) |
- |
\ |
O(n*log(n)) |
- |
F |
O(n*log(n)) |
- |
ВЫВОДЫ
Мы получили практические навыки работы с ДДП (АВЛ дерево). Выбор АВЛ дерева удачен для нашего варианта задания на обработку множеств. Мы всегда используем операции поиска и вставки, которые имеют временную сложность O(log n).
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
-
Алгоритмы и структуры данных. – Методические указания к лабораторным работам, практическим занятиям и курсовому проектированию, часть 2, глава 1 «Работа с иерархией объектов: наследование и полиморфизм».
ПРИЛОЖЕНИЕ
Source.Cpp
/*
* C++ program to Implement AVL Tree
*/
#include<iostream>
#include<cstdio>
#include<sstream>
#include<algorithm>
#include "avl_tree.h"
#include <time.h>
#define pow2(n) (1 << (n))
using namespace std;
const int N = 10;
avlTree generate();
/*
* Main Contains Menu
*/
int main()
{
setlocale(LC_ALL, "RU");
srand(time(NULL));
avlTree
a = generate(),
b = generate(),
c = generate(),
d = generate(),
e = generate();
cout << endl << "------------------------------------- Дерево A: --------------------------------------------------" << endl;
a.display(a.root, 1);
cout << endl << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////";
cout << endl << "------------------------------------- Дерево B: --------------------------------------------------" << endl;
b.display(b.root, 1);
cout << endl << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////";
cout << endl << "------------------------------------- Дерево C: --------------------------------------------------" << endl;
c.display(c.root, 1);
cout << endl << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////";
cout << endl << "------------------------------------- Дерево D: --------------------------------------------------" << endl;
d.display(d.root, 1);
cout << endl << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////";
cout << endl << "------------------------------------- Дерево E: --------------------------------------------------" << endl;
e.display(e.root, 1);
avlTree f = ((a&b) / (c&d)) ^ e;
cout << endl << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////";
cout << endl << "------------------------------ Дерево F = ( (A & B) / (C & D) ) ^ E: -----------------------------" << endl;
f.display(f.root, 1);
cout << endl << endl << "//////////////////////////////////////////////////////////////////////////////////////////////////";
printf("\n");
system("pause");
return 0;
}
avlTree generate() {
avlTree result = avlTree();
static char *uni = new char[N];
int k = 0;
for (int i = 0; i < N; i++) {
uni[i] = k;
k++;
}
int count = 1 + rand() % (N - 1);
int x;
for (int i = 0; i < count; i++)
{
int p = rand() % (N - i);
if (p)
{
result.root = result.insert(result.root, uni[p + i]);
x = uni[i];
uni[i] = uni[i + p];
uni[i + p] = x;
}
}
result.inorder(result.root);
return result;
}