Kolejka Priorytetowa...

0

Ehh..
Mam zaimplementowana kolejke priorytetowa. Chcialbym moc jednak zmienic wartosc danego priorytetu juz po tym jak zostal on umieszczony w kolejce.
Aby to zrobic musze ow priorytet wyszukac. Chodzi o to zeby wyszukiwanie tego priorytetu bylo natychmiastowe czyli O(1). Musze wiec posiadac wskaznik do kazdego elementu w kolejce. I tu jest pies pogrzebany, nie moge tego poprawnie zaimplementowac.
Oto kod procedury budujacej kolejke. Kolejka buduje sie poprawnie ale wskazniki zle wskazuja:/

jakies pomysly?


type Wierzcholek = record
  Odleglosc: Integer;  //odleglosc czyli priorytet
  Wskaznik: Integer;
end;

TablicaWierzcholkow: array [1..15] of Wierzcholek;

procedure TForm1.PrzesunWDol(Rodzic: Integer);
var
  Dziecko,  NajwiekszyPriorytet,Wskaznik: Integer;
begin
  NajwiekszyPriorytet:= TablicaWierzcholkow[Rodzic].Odleglosc;
  Wskaznik:=TablicaWierzcholkow[Rodzic].Wskaznik;
  repeat
    Dziecko:= 2* Rodzic;
    if(Dziecko > LiczbaWierzcholkow) then
    begin
      break
    end else
    begin
      if (Dziecko < LiczbaWierzcholkow) then
      begin

        if (TablicaWierzcholkow[Dziecko+1].Odleglosc >
        TablicaWierzcholkow[Dziecko].Odleglosc)
        then
          Dziecko:=Dziecko+1;
      end;

      if (TablicaWierzcholkow[Dziecko].Odleglosc> NajwiekszyPriorytet) then
      begin
        TablicaWierzcholkow[Rodzic]:=TablicaWierzcholkow[Dziecko];
        Rodzic:=Dziecko;
      end else
      begin
        Break;
      end;
    end;
  until (False);
  TablicaWierzcholkow[Rodzic].Odleglosc:=NajwiekszyPriorytet;
  TablicaWierzcholkow[Rodzic].Wskaznik:=Rodzic;
end;

procedure TForm1.BudujStos;
var
  i: Integer;
begin
  for i:= 7 downto 1 do
    PrzesunWDol(i);
end;

Z gory dziekuje za pomoc,

Wodzu

0

hmm mozna by to chyba z robic w ten sposob ze trzymasz elementy kolejki jako normalna tablica a dodatkowo tworzysz kopiec w ktorym kazdy element to priorytet i wskaznik do elementu kolejki, wtedy czas dostepu do znanego elementu to O(1), czas dostepu do elementu o najwiekszym lub najmniejszym (zaleznie od implementacji) priorytecie to O(1) a zmiana priorytetu zajmuje ci czas O(lg n) - (poprawienie kopca).

1 użytkowników online, w tym zalogowanych: 0, gości: 1