Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Построение класса параметризованного ограниченного массива.↑ ⇐ ПредыдущаяСтр 3 из 3 Содержание книги
Поиск на нашем сайте
#include <iostream.h> #include <stdlib.h> // параметризованный класс ограниченого массива template <class Atype> class atype { Atype *a; int length; public: atype (int size); ~atype () { delete [] a; } Atype &operator[] (int I);}; // конструктор template <class Atype> atype<Atype>::atype(int size) { length = size; a = new Atype[size]; // динамически выделение области хранения if (!a) {cout << "Невозможно выделить массив"; exit (1);} for (int i=0; i<size; i++) a[i] = 0;} template <class Atype> Atype &atype<Atype>::operator [] (int i) {if (i<0 || i>length-1){ cout << "\nЗначение с индексом "; cout << i << " выходит за пределы диапазона. \n"; exit (1);} return a[i];} int main () {atype<int> intob(20); // массив целых чисел atype<double> doubleob(10); // массив рациональных чисел int i; cout << "Массив целых: "; for (i=0; i<20; i++) { intob[i] = i; cout << intob[i] << " ";} cout << endl; cout << "Массив дробных чисел: "; for (i=0; i<10; i++) {doubleob[i] = (double)i * 3.14; cout << doubleob[i] << " "; } cout << endl; intob[45] = 100; // генерация ошибки return 0;}
Построение параметризованного класса очереди. #include <iostream.h> #include <stdlib.h> // параметризированный класс очереди template <class Qtype> class queue {Qtype *q; int sloc, rloc; int length; public: queue (int size); ~queue() { delete [] q; } void add (Qtype x); Qtype pop (); }; // конструктор template <class Qtype> queue<Qtype>::queue(int size) { size++; q = new Qtype[size]; if (!q) {cout << "Невозможно создать очередь.\n"; exit(1); } length = size; sloc = rloc = 0; } // добавление элемента template <class Qtype> void queue<Qtype>::add(Qtype i) { if (sloc+1==length) { cout << "Очередь заполнена"; return; } sloc++; q[sloc] = i; } // извлечение элемента template <class Qtype> Qtype queue<Qtype>::pop() { if (rloc == sloc){ cout << "Очередь пуста.\n"; return 0; } rloc++; return q[rloc]; } int main () { queue<int> a(5), b(5); a.add(100); b.add(200); a.add(300); b.add(400); cout << "Очередь int 1: "; cout << a.pop() << " "; cout << a.pop() << " \n"; cout << "Очередь int 2: "; cout << b.pop() << " "; cout << b.pop() << " "; queue<double> c(5), d(5); c.add(8.12); d.add(9.23); c.add(-2.2); d.add(0.986); cout << "Очередь double 1: "; cout << c.pop() << " "; cout << c.pop() << " \n"; cout << "Очередь double 2: "; cout << d.pop() << " "; cout << d.pop() << " "; return 0; }
void Drob::Vvod(void) { соut«"Числитель?"; cin»A.P; cout«"Знаменатель?"; cin»A.Q;} int Drob::NOD(void) { int M,N; M=abs(A.P); N=A.Q; while(M!=N) { if(M>N) if(M%N!=0) M=M%N; else M=N; else if(N%M!=0) N=N%M; else N=M;} return M;} void Drob::Sokr(void) { int X; X=NOD(); if(A.P!=0) { A.P=A.P/X; A.Q=A.Q/X;} else A.Q=1;} void Drob::Stepen(int N) { int i; F.P=F.Q=1; for(i=l;i<=N;i++) { F.P*=A.P; F.Q*=A.Q;}} void Drob::Print(void) { cout«"\n"«A.P«"/"«A.Q«"\n"; } void main(void) { Drob Y; //Объявление объекта cout«"Вводите дробь! "<<"\n"; Y.VvodO; Y.Sokr (); cout«"дробь после сокращения:"<<"\n"; Y.Print(); Y.Stepen(2); cout<<" дробь, возведенная в квадрат:"<<"\п"; cout «F. P «" / " «F. Q «" \ n "; }
Збалансовані дерева. Включення в збалансоване дерево. Два випадки балансування. Идеально сбалансированным называется дерево, у которого для каждой вершины выполняется требование: число вершин в левом и правом поддеревьях различается не более, чем на 1. Однако идеальную сбалансированность довольно трудно поддерживать. В некоторых случаях при добавлении/удалении может потребоваться значительная перестройка дерева, не гарантирующая логарифмической сложности. Поэтому Г.М.Адельсон-Вельский и Е.М.Ландис ввели менее строгое определение сбалансированности и доказали, что при таком определении можно написать программы добавления/удаления, имеющие логарифмическую сложность и сохраняющие дерево сбалансированным. Дерево считается сбалансированным, если для каждой вершины выполняется требование: высота левого и правого поддеревьев различаются не более, чем на 1. Не всякое сбалансированное дерево идеально сбалансировано, но всякое идеально сбалансированное дерево сбалансировано. Вращения. При операциях добавления и удаления может произойти нарушение сбалансированности дерева. В этом случае потребуются некоторые преобразования, не нарушающие упорядоченности дерева и способствующие лучшей сбалансированности. Рассмотрим такие преобразования. Предварительно договоримся, что в каждой вершине дерева помимо значения элемента будем хранить показатель сбалансированности в данной вершине. Показатель сбалансированности - разница между высотами правого и левого поддеревьев. PTree = ATTree; TTree = record Item: T; {элемент дерева} Left, Right: PTree; {указатели на поддеревья} Balance: ShortInt; {показатель сбалансированности} end; В сбалансированном дереве показатели сбалансированности всех вершин лежат в пределах от - 1 до 1. При операциях добавления/удаления могут появляться вершины с показателями сбалансированности -2 и 2. А теперь перейдем к рассмотрению преобразований. Малое левое вращение. Пусть показатель сбалансированности вершины, в которой произошло нарушение баланса, равен -2, а показатель сбалансированности корня левого поддерева равен -1. Тогда восстановить сбалансированность такого поддерева можно следующим преобразованием, называемым малым левым вращением: На приведенном рисунке прямоугольниками обозначены поддеревья. Рядом с поддеревьями указана их высота. Поддеревья помечены арабскими цифрами. Кружочками обозначены вершины. Цифра рядом с вершиной - показатель сбалансированности в данной вершине. Буква внутри кружка - условное обозначение вершины. Как видно из рисунка после малого левого вращения показатель сбалансированности вершины, в которой было нарушение баланса, становится равным нулю. Малое правое вращение. В случае, когда показатель сбалансированности вершины, в которой произошло нарушение баланса, равен 2, а показатель сбалансированности корня правого поддерева равен 1, восстановить сбалансированность в вершине можно с помощью преобразования, называемого малым правым вращением. Это вращение симметрично малому показатели сбалансированности проходимых вершин и производится балансировка там, где это необходимо. Добавление элемента в дерево никогда не требует более одного поворота.
|
||||
Последнее изменение этой страницы: 2016-08-14; просмотров: 137; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.153.240 (0.007 с.) |