Меню

Главная

Статистика

 

 


4. Реализация операции добавления элемента.

При выполнении операции добавления элемента со значением 17, элемент должен поместиться на свободное место, т.е. позицию с индексом Num+1. Однако эта позиция может не соответствовать правильному положению элемента в куче, так как над ним может находиться элемент, имеющий меньший приоритет. Понятно, что в этом случае для вершины с индексом 5 нарушается основное свойство кучи. Эта ситуация изображена на рис 6а.

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

Легко видеть, что при таком обмене свойство для вершин, стоящих ниже, не нарушается. Такое преобразование приводит к новому полному бинарному дереву (рис 6б.), которое еще не удовлетворяет основному свойству кучи (для вершины с индексом 2). Поэтому применяем аналогичный обмен для вершины с индексом 5. Результат этого преобразования изображен на рис 7. В результате получено полное бинарное дерево, которое удовлетворяет основному свойству кучи. Поэтому, процедура добавления элемента завершена.

S[0]: = 0;
for i:= 1 to N do               {1. 1}
 S[i]: = S[i - 1] + a[i];
                    
Type Queue=array[1.. maxqueue] of real;
        
procedure insert(x:integer;
                         var H: array [0..n] of integer;
                         var Num:integer;
                         var code:integer;);
var i;
begin
if Num=n
  then
   code:=1
  else
   begin
     Num:=Num+1;
     i:=Num;
     H[0]:=x;                            {барьер}
     while (x < H[i div 2]) do
      begin
       H[i]:=H[i div 2];
       i:=i div 2;
      end; {while}
     H[i]:=x;
     code:=0;
   end; {if}
end;  {insert}
            
function delete_min(var H: array [0..n] of integer;
                               var Num:integer;
                               var code:integer):integer;
var i,child:integer;
  last_el:element;
  stop:boolean;
begin
if Num=0
  then
   code:=2
  else
   begin
     delete_min:=H[1];
     last_el:=H[Num];
     Num:=Num-1;
     i:=1; stop:=False;
     while (2*i<=Num) and (not stop) do
      begin
        child:=2*i;
        if child < Num  then
          if H[child+1] < H[child]
            then child:=child+1;
        if last_el > H[child] then
          begin
            H[i]:=H[child];
            i:=child;
          end
          else
             stop:=True;
      end; {while}
     H[i]:=last_el;
     code:=0;
   end; {if}
end; {delete_min}
            

Трудоемкость операции добавления определяется количеством выполнения цикла while и не превышает количества уровней кучи, которое равно Log2 (Num).

Назад

выбор радиатора отопления качественные бойлера водонагреватели stiebel eltron. дизельэлектростанции аренда генераторов дизельгенератор дизель генератор. Нужна - сантехника, ванны, душевые кабины. мебель ванна и гидромассажные ванны. Посетите нас. печать брошюры листовок брошуры сообщение