Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.13;
Скачать: CL | DM;

Вниз

бинарная куча   Найти похожие ветки 

 
sat ©   (2007-04-24 16:53) [0]

вообщем я написал процедуру и функцию для работы с бинарной кучей
(добавление жлемента в кучу и удаление минимального)

помогите отладить. где то в алгоритме допущена ошибка


procedure AddHeap (x , count : integer);       //add to heap element
var
 i : integer;
begin
 inc(count);
 i := count;
 heap[0] := x;
 while (x < Heap[i  div 2])do
  begin
    Heap[i]:=Heap[i div 2];
    i:=i div 2
  end;
  Heap[i] := x ;
end;

function deletemin(count:integer):integer;
var i,child:integer;
   last_el:integer;
   stop:boolean;
begin
       deletemin:=Heap[1];
       last_el:=Heap[count];
       dec(count);
       i:=1;
       stop:=False;
       while (2*i<=count) and (not stop) do
         begin
           child:=2*i;
           if child < count  then
             if Heap[child+1] < Heap[child] then child:=child+1;
           if last_el > Heap[child] then
             begin
               Heap[i]:=Heap[child];
               i:=child;
             end
             else
               stop:=True;
         end; {while}
       Heap[i]:=last_el;
end;



 
Сергей М. ©   (2007-04-24 16:55) [1]


> с бинарной кучей


Эт что еще за зверь ?)


 
sat ©   (2007-04-24 16:57) [2]

есть такая структура используется для сортировки массива(очень быстрой n*log(n))...

просто где то допустил ошибку и не могу найти


 
Сергей М. ©   (2007-04-24 17:00) [3]

Куча-то причем тут ? Это ж вроде бы термин из совсем другой оперы - вот что не понятно ..


 
sat ©   (2007-04-24 17:01) [4]

нормальный термин binary heap

не надо путать с динамической памятью...


 
MBo ©   (2007-04-24 17:05) [5]

heap[0] := x;

А нулевой элемент (вершину кучи) в мусорку?
Нужно записывать новый элемент последним и выполнять всплытие.

while (x < Heap[i  div 2])do
это и дальнейшее не имеет смысла, однако уточню, что для куч в массиве с нумерацией с нуля отношение индексов будет не такое, как используется у тебя (твое соответствует нумерации с единицы)

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

пример вставки нового элемента
 if FCount = FSize then
   Grow;
 FA[FCount] := Value;// вставили последним
 Inc(FCount);
 FixUp(FCount - 1);//всплытие

извлечение минимума
   Result := FA[0];
   Dec(FCount);
   FA[0] := FA[FCount];  //записали последний на место удаленного
   FixDown(0)  //погружение


 
Сергей М. ©   (2007-04-24 17:06) [6]


> термин binary heap
>
> не надо путать с динамической памятью


А никто и не путает)

И дин.память с Windows heaps тоже никто не путает)


 
MBo ©   (2007-04-24 17:10) [7]

>Сергей М
Действительно есть такая структура данных - heap, куча, другое название - пирамида, используется в пирамидальной сортировке (HeapSort) и в очередях по приоритетам.
Конфликт имен, как с потоками thread/stream, блин ;)



Страницы: 1 вся ветка

Текущий архив: 2007.05.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
4-1166102906
gary
2006-12-14 16:28
2007.05.13
Hook


2-1177065316
Ezorcist
2007-04-20 14:35
2007.05.13
Вопрос по работе с xml-файлом.


3-1172297929
SergTT
2007-02-24 09:18
2007.05.13
Иерархическое отображение данных


2-1177416513
Ксандр
2007-04-24 16:08
2007.05.13
SendMessage...


10-1123757517
kblc
2005-08-11 14:51
2007.05.13
Связь с сервером