Скачать 305.47 Kb.
|
Таб. 1. Средние трудоемкости операций (обычный случай) Рис. 1. Графики трудоемкостей операций (обычный случай)
Таб. 2. Средние трудоемкости операций (худший случай)
Проанализировав полученные графики, можно сделать вывод, что трудоемкость тестируемых операций в среднем случае для BST-дерева и рандомизированного практически одинаковая и близка к оценке 1.39*O(log2n). Что касается тестирования операций для худшего случая, то здесь наблюдается значительное увеличение трудоемкостей операций BST-дерева и теперь они близки к оценке O(n/2). Это происходит из-за того, что дерево заполняется последовательностью из возрастающих ключей, что приводит к вырождению дерева в список. Но такое заполнение дерева не оказывает никакого влияния на трудоемкости операций рандомизированного дерева, что говорит о том, что по структуре оно остается близким к сбалансированному дереву.
В процессе разработки АТД «Двоичное дерево поиска» и АТД «Сбалансированное дерево поиска» были запрограммированы различные операции для работы с данными произвольных типов. Также разработан итератор последовательного доступа к элементам деревьев, позволяющий также выводить и редактировать элементы структуры данных. Было проведено тестирование структуры данных в двух видах. Первый позволяет вывести содержимое дерева в удобной форме после выполнения ряда операций над деревом. Второй – тестирование трудоемкостей алгоритмов операций поиска, удаления и вставки для деревьев больших размерностей. Операции удаления и вставки для обоих деревьев в среднем случае показали результаты, очень близкие к теоретической трудоемкости 1,39*O(). В худшем случае трудоемкости алгоритмов BST – дерева приближаются к оценке O(n/2), на трудоемкости RND – дерева худший случай никак не отразился.
1.) Проектирование и реализация коллекций данных: учебно-методическое пособие, Т.А, Романенко. – Новосибирск: Изд-во НГТУ, 2005. – 112 с. 2.) Фундаментальные алгоритмы на С++. Анализ/Структуры данных/Сортировка/Поиск: Пер. с англ./ Роберт Седжвик – К.: Издательство «ДиаСофт», 2001. – 688 с. Исходный код программы с комментариями: //tree.h #include "rus.h" // ---------BST---------------- template template class node { public: T data; int key; node *left; node *right; int n; //количество узлов в поддереве (для RND дерева) node() { left=right=NULL; key=-1; data=-1; n=0; } node(int _key, T _data, BST { left=right=tr->fict; key=_key; data=_data; n=1; } }; template class BST { protected: node int sz; //размерность дерева public: node int np_find; int np_add; int np_del; BST(); node node node node int GetSize(); //Опрос размера дерева bool ClearTree(); //Очистка дерева bool IsEmpty(); //Проверка дерева на пустоту T Search(int _key); //Поиск данных с заданным ключом virtual bool Add(int _key, T _data); //Включение данных с заданным ключом virtual bool Delete(int _key); //Удаление данных с заданным ключом virtual bool Show(); //Вывод дерева protected: int BST_GetSize(node void BST_Show(node void BST_ClearTree(node public: class Iterator //Итератор { BST node bool set; public: Iterator(BST { if (T0==NULL) pt=NULL; else pt=T0; set=false; } bool first() { if(pt->root==pt->fict)return false; else { for(cur=pt->root;cur->left!=pt->fict;cur=cur->left); set=true; return true; } } bool last() { if(pt->root==pt->fict)return false; else { for(cur=pt->root;cur->right!=pt->fict;cur=cur->right); set=true; return true; } } bool next() { if(set==false) return false; node if(cur->right!=pt->fict) { node for(;x->left!=pt->fict;x=x->left); cur=x; return true; } cur=L_Parent(pt->root,cur); if(cur!=pt->fict) return true; else {cur=t; set=false; return false; } } node { if(t==x)return pt->fict; if(x->key { node if(lp!=pt->fict)return lp; else return t; } else return L_Parent(t->right,x); } bool prev() { if(set==false) return false; node if(cur->left!=pt->fict) { node for(;x->right!=pt->fict;x=x->right); cur=x; return true; } cur=R_Parent(pt->root,cur); if(cur!=pt->fict)return true; else {cur=t; set=false; return false;} } node { if(t==x)return pt->fict; if(x->key > t->key) { node if(rp!=pt->fict)return rp; else return t; } else return R_Parent(t->left,x); } bool is_off() { return (set==false); } T& operator *() { if (is_off()) throw -1; else return cur->data; } }; friend class Iterator; friend class node }; template BST { sz=0; fict=new node root=fict; np_find=0; np_add=0; np_del=0; } template node { np_add++; if (t==fict) { t=new node inserted=true; } else { if(_key==t->key) { inserted=false; return t; } else { inserted=true; if(_key else t->right = BST_Add(t->right, _key, _data, inserted); } } return t; } template bool BST { bool inserted=false; if (root==fict) { np_add=0; root=new node sz++; return true; } else { np_add=0; BST_Add(root,_key,_data,inserted); if (inserted==true) sz++; return inserted; } return false; } template node { np_del++; if(t==fict) { deleted=false; return t; } if(_key { t->left=BST_Delete(t->left,_key,deleted); return t; } else if(_key>t->key) { t->right=BST_Delete(t->right,_key,deleted); return t; } deleted=true; if (t->left==fict && t->right==fict) { if (t==root) root=fict; delete t; return fict; } if (t->left==fict) { node delete t; return x; } if (t->right==fict) { node delete t; return x; } t->right=Del(t->right,t); return t; } template node { np_del++; if (t->left!=fict) { t->left=Del(t->left,t0); return t; } t0->key=t->key; t0->data=t->data; node delete t; return x; } template bool BST { np_del=0; bool deleted=false; if (root==fict) return false; else root=BST_Delete(root, _key, deleted); if (deleted==true) sz--; return deleted; } template node { np_find++; if(t==fict) return t; if(_key else if (_key>t->key) return BST_Search(t->right,_key); if (_key==t->key) return t; } template T BST { np_find=0; if(root==fict) throw -2; node if(x!=fict) return x->data; else throw -1; } template int BST { return sz; } template bool BST { if (IsEmpty()) return false; BST_ClearTree(root); root=fict; sz=0; return true; } template void BST { if(t->left!=fict) BST_ClearTree(t->left); if(t->right!=fict) BST_ClearTree(t->right); delete t; } //Проверка на пустоту template bool BST { return (root==fict); } template bool BST { if (IsEmpty()) return false; BST_Show(root,0); return true; } template void BST { if (t==fict) return; BST_Show(t->right, nbsp+1); for (int i=0;i<2*nbsp; i++) cout<<" "; cout<<"("< BST_Show(t->left, nbsp+1); } // ---------RND---------------- template class RND: public BST { protected: node { node x=t->left; t->left=x->right; x->right=t; if(t->left==fict) { if(t->right==fict) t->n=1; else t->n=t->right->n+1; } else { if(t->right==fict) t->n=t->left->n+1; else t->n = t->left->n + t->right->n + 1; } if(x->left==fict) x->n=x->right->n+1; else x->n = x->left->n + x->right->n + 1; return x; } node { node x=t->right; t->right=x->left; x->left=t; if(t->left==fict) { if(t->right==fict) t->n=1; else t->n=t->right->n+1; } else { if(t->right==fict) t->n=t->left->n+1; else t->n = t->left->n + t->right->n + 1; } if(x->right==fict) x->n=x->left->n+1; else x->n = x->left->n + x->right->n + 1; return x; } node { np_add++; if (t==fict) { t=new node t->n=1; inserted=true; return t; } if (_key==t->key) { inserted=false; return t; } if (rand() { t=RND_Add_Root(t,_key,_data,inserted); return t; } else { if(_key else t->right = RND_Add(t->right, _key, _data, inserted); } if (inserted==true) t->n++; return t; } node { np_add++; if (t==fict) { t=new node t->n=1; inserted=true; return t; } if (_key==t->key) { inserted=false; return t; } if (_key { t->left=RND_Add_Root(t->left, _key, _data, inserted); if (inserted==true) return Rn(t); else return t; } t->right=RND_Add_Root(t->right, _key, _data, inserted); if (inserted==true) return Ln(t); else return t; } node { np_del++; if(t==fict) { deleted=false; return t; } else { if(t->key==_key) { node t=RND_Join(t->left,t->right); delete x; deleted=true; return t; } else { if(t->key>_key) t->left=RND_Delete(t->left,_key, deleted); else t->right=RND_Delete(t->right,_key, deleted); } } if(deleted==true) t->n--; return t; } node { np_del++; if(l==fict) return r; if(r==fict) return l; double rrr=(double)rand()/RAND_MAX; double nnn=(double)l->n/(l->n+r->n); if (rrr < nnn) { l->right=RND_Join(l->right,r); if(l->left==fict) l->n=l->right->n+1; else if(l->right==fict) {l->n=l->left->n+1;} else l->n=l->left->n+l->right->n+1; return l; } else { r->left=RND_Join(l,r->left); if(r->left==fict) r->n=r->right->n+1; else if(r->right==fict) {r->n=r->left->n+1;} else r->n=r->left->n+r->right->n+1; return r; } return r; } public: bool Add(int _key, T _data); bool Delete(int _key); bool Show(); void RND_Show(node }; template bool RND { np_add=0; bool inserted=false; if (root==fict) { root=new node root->n=1; sz++; return true; } else { root=RND_Add(root,_key,_data,inserted); if (inserted==true) sz++; return inserted; } return false; } template bool RND { np_del=0; bool deleted=false; if (root==fict) return false; else root=RND_Delete(root, _key, deleted); if (deleted==true) sz--; return deleted; } template bool RND { if (IsEmpty()) return false; RND_Show(root,0); return true; } template void RND { if (t==fict) return; RND_Show(t->right, nbsp+1); for (int i=0;i<2*nbsp; i++) cout<<" "; cout<<"("< RND_Show(t->left, nbsp+1); } |
Конспект урока по информатике для учащихся 11 класса «Средства поиска данных в Интернете» Введение. Содержание дисциплины и порядок ее изучения. Фактографический поиск. Математические модели фактографического поиска. Информационная... | Реферат на тему «Сбалансированное питание это здоровье нации» Здоровье человека важный показатель его личного успеха. Одним из важнейших условий сохранения и укрепления здоровья является сбалансированное... | ||
Реферат на тему «Сбалансированное питание это здоровье нации» Здоровье человека важный показатель его личного успеха. Одним из важнейших условий сохранения и укрепления здоровья является сбалансированное... | Коллекция/модуль поиска | ||
В базе данных Исакова О. Н. Основы поиска патентов в базе данных Европейского патентного ведомства: Препринт 03 – Новосибирск: гпнтб со ран, 2003.... | Программа дисциплины Технологии поиска, анализа данных и распространения информации в Интернет Значение проекта Семантическая Паутина для расширения возмож-ностей смыслового поиска информации в сети Интернет | ||
Урока информатики по теме «Табличные базы данных». (Открытый урок.) Данный урок «База данных. Системы управления базами данных» является первым уроком по теме «Технологии хранения, поиска и сортировки... | Коллекция обивочных тканей Данная коллекция станет украшением любой модели кроватей. Ткань относится к категории мебельного атласа отличается не только богатым... | ||
Определитесь с инструментами поиска Для обнаружения в текстах фрагментов, аналогичных заданному, используются инструменты линейного поиска информации. К таким инструментам... | Коллекция игр Играющие садятся в круг, ведущий объявляет, что все участники игры, начиная с первого, должны назвать по одному растению, причем... | ||
Коллекция 038 Белгород Это пример платной текущей распечатки бдкр, вместо контактных данных указаны только номера коллекций и | Коллекция 614 Тюмень Это пример платной текущей распечатки бдкр по комнатным растениям, вместо контактных данных указаны только | ||
Коллекция 589 Мордовия, Саранск Это пример платной текущей распечатки бдкр по садовым овощным растениям, вместо контактных данных указаны | Программа по формированию навыков безопасного поведения на дорогах... Сейба, дынное дерево, шоколадное дерево, пальмы, фикусы, гевея, кувшинка Виктория регия | ||
Литература по химии. Азбука веб-поиска для химиков. Методика поиска... Химия и жизнь: научно-популярный журнал. Электронная версия научно-популярного журнала. Архив содержаний номеров. Доступ к полной... | Тематика контента (источников, баз(ы) данных Архив (acs legacy Archives) 25-ти журналов коллекция ретроспективных выпусков журналов с 1879 по 1995гг. Реферативные источники |