Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVET_OAIP.docx
Скачиваний:
22
Добавлен:
27.09.2019
Размер:
589.57 Кб
Скачать

33. Бинарная куча. Определение родительской и дочерних вершин.

Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.

для которого выполнены три условия:

  1. Значение в любой вершине не меньше, чем значения её потомков.

  2. Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.

  3. Последний слой заполняется слева направо

  4. Каждая вершина содержит ключ и информацию

Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].

Для каждого элемента множества по индексу можно определить левую и правую дочерние вершины. Для родительской, левой и правой дочерней вершины задаются определенным для каждого виды вершины способом индекс.

Определение родительской вершины:

int Heap::Parent(int ix)

{ return (ix+1)/2-1; }

Определение левой дочерней вершины:

intHeap::Left(intix)

{ return (2*ix+1>=Size)?-1:(2*ix+1); }

Определение правой дочерней вершины:

int Heap::Right(int ix)

{ return (2*ix+2>=Size)?-1:(2*ix+2); }

34. Бинарнаякуча. Алгоритм построения кучи из произвольного массива.

Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.

для которого выполнены три условия:

  1. Значение в любой вершине не меньше, чем значения её потомков.

  2. Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.

  3. Последний слой заполняется слева направо

  4. Каждая вершина содержит ключ и информацию

Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].

Алгоритм построения кучи из произвольного массива: неэффективны по времени выполнения основных операций: поиск, для поддержки упорядоченность массива по ключу, - "неудобна" операция вставки нового элемента.

Object* Build(intmaxsize,CMP(*f)(void*,void*),void* x[]){

Heap* rc=new Heap(maxsize,f,x);

rc->Size=rc->MaxSize;

for(int i=(rc->Size-1)/2;i>=0;i--) rc->Heapify(i);

returnrc;}

Массив x[1..N]

Heapify к массиву в порядке убывания начиная с вершины c [(N-1)/2]

- удовлетворяют основному свойству

Сортировка массива без использования дополнительной памяти SortHeap:

  1. выполнить процедуру BuildHeap;

  2. обменять местами элементы A[0] и A[n-1];

  3. уменьшить размер кучи на единицу:

  4. выполнить процедуру Heapify для элемента 0 и т.д.

35. Бинарная куча. Извлечение наибольшего элемента. Оценка сложности

Бинарной (двоичной) кучей (binary heap) называется массив, обладающей определенными свойствами упорядоченности.

для которого выполнены три условия:

  1. Значение в любой вершине не меньше, чем значения её потомков.

  2. Глубина листьев (расстояние до корня) отличается не более чем на 1 слой.

  3. Последний слой заполняется слева направо

  4. Каждая вершина содержит ключ и информацию

Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Heapify. Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов A и индекс i. Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент A[i].

Извлечение наибольшего элемента (макс. зн. содержится в самой верхнем родителе):

ExtractMax – извлечение наибольшего (используется в очередях с приоритетами).

Процедура ExtractMax- извлекает из кучи максимальный элемент, не нарушая основного свойства кучи.

Алгоритм ExtractMax:

  1. сохранить значение элемента A[0] в промежуточной памяти;

  2. записать значение последнего элемента кучи A[N-1] в A[0];

  3. уменьшить на единицу размер кучи;

  4. выполнить процедуру Heapify для элемента 0.

Сложность T[N] ExtractMax состоит из сложности алгоритма Heapify и плюс фиксированное число операций, т.е. T[N]=O(log2N)+O(1)=O(log2N).

void* Heap::ExtractMax()

{

void* rc;

if(!isEmpty())

{

rc=Storage[0];

Storage[0]=Storage[Size-1];

Size--;

Heapify(0);

}

else throw (ExcEmpty)EXTRACT;

returnrc;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]