Changeset 447 for trunk/IPQ.pas


Ignore:
Timestamp:
May 19, 2022, 10:39:34 PM (2 years ago)
Author:
chronos
Message:
  • Modified: Use first capital letter in identifiers.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPQ.pas

    r442 r447  
    11{ binary heap priority queue
    2   code contributed by Rassim Eminli }
     2  Code contributed by Rassim Eminli }
    33
    44{$INCLUDE Switches.inc}
     
    88
    99type
    10   TIntegerArray = array [0 .. $40000000 div sizeof(integer)] of integer;
     10  TIntegerArray = array [0 .. $40000000 div SizeOf(Integer)] of Integer;
    1111  PIntegerArray = ^TIntegerArray;
    1212
    1313  TheapItem = record
    14     Item: integer;
    15     Value: integer;
     14    Item: Integer;
     15    Value: Integer;
    1616  end;
    1717
    18   TItemArray = array [0 .. $40000000 div sizeof(TheapItem)] of TheapItem;
     18  TItemArray = array [0 .. $40000000 div SizeOf(TheapItem)] of TheapItem;
    1919  PItemArray = ^TItemArray;
    2020
    2121  TIPQ = class
    22     constructor Create(max: integer);
     22    constructor Create(Max: Integer);
    2323    destructor Destroy; override;
    2424    procedure Empty;
    25     function Put(Item, Value: integer): boolean;
    26     function TestPut(Item, Value: integer): boolean;
    27     function Get(var Item, Value: integer): boolean;
     25    function Put(Item, Value: Integer): Boolean;
     26    function TestPut(Item, Value: Integer): Boolean;
     27    function Get(var Item, Value: Integer): Boolean;
    2828  private
    2929    // n - is the size of the heap.
    3030    // fmax - is the max size of the heap.
    31     n, fmax: integer;
     31    N, fmax: Integer;
    3232
    3333    // bh - stores (Value, Item) pairs of the heap.
     
    3939implementation
    4040
    41 constructor TIPQ.Create(max: integer);
     41constructor TIPQ.Create(Max: Integer);
    4242begin
    4343  inherited Create;
    44   fmax := max;
    45   GetMem(bh, fmax * sizeof(TheapItem));
    46   GetMem(Ix, fmax * sizeof(integer));
    47   n := -1;
     44  fmax := Max;
     45  GetMem(bh, fmax * SizeOf(TheapItem));
     46  GetMem(Ix, fmax * SizeOf(Integer));
     47  N := -1;
    4848  Empty;
    4949end;
     
    5858procedure TIPQ.Empty;
    5959begin
    60   if n <> 0 then
     60  if N <> 0 then
    6161  begin
    62     FillChar(Ix^, fmax * sizeof(integer), 255);
    63     n := 0;
     62    FillChar(Ix^, fmax * SizeOf(Integer), 255);
     63    N := 0;
    6464  end;
    6565end;
    6666
    6767// Parent(i) = (i-1)/2.
    68 function TIPQ.Put(Item, Value: integer): boolean; // O(lg(n))
     68function TIPQ.Put(Item, Value: Integer): Boolean; // O(lg(n))
    6969var
    70   i, j: integer;
     70  I, J: Integer;
    7171  lbh: PItemArray;
    7272  lIx: PIntegerArray;
     
    7474  lIx := Ix;
    7575  lbh := bh;
    76   i := lIx[Item];
    77   if i >= 0 then
     76  I := lIx[Item];
     77  if I >= 0 then
    7878  begin
    79     if lbh[i].Value <= Value then
     79    if lbh[I].Value <= Value then
    8080    begin
    81       result := False;
    82       exit;
     81      Result := False;
     82      Exit;
    8383    end;
    8484  end
    8585  else
    8686  begin
    87     i := n;
    88     Inc(n);
     87    I := N;
     88    Inc(N);
    8989  end;
    9090
    91   while i > 0 do
     91  while I > 0 do
    9292  begin
    93     j := (i - 1) shr 1; // Parent(i) = (i-1)/2
    94     if Value >= lbh[j].Value then
    95       break;
    96     lbh[i] := lbh[j];
    97     lIx[lbh[i].Item] := i;
    98     i := j;
     93    J := (I - 1) shr 1; // Parent(i) = (i-1)/2
     94    if Value >= lbh[J].Value then
     95      Break;
     96    lbh[I] := lbh[J];
     97    lIx[lbh[I].Item] := I;
     98    I := J;
    9999  end;
    100100  // Insert the new Item at the insertion point found.
    101   lbh[i].Value := Value;
    102   lbh[i].Item := Item;
    103   lIx[lbh[i].Item] := i;
    104   result := True;
     101  lbh[I].Value := Value;
     102  lbh[I].Item := Item;
     103  lIx[lbh[I].Item] := I;
     104  Result := True;
    105105end;
    106106
    107 function TIPQ.TestPut(Item, Value: integer): boolean;
     107function TIPQ.TestPut(Item, Value: Integer): Boolean;
    108108var
    109   i: integer;
     109  I: Integer;
    110110begin
    111   i := Ix[Item];
    112   result := (i < 0) or (bh[i].Value > Value);
     111  I := Ix[Item];
     112  Result := (I < 0) or (bh[I].Value > Value);
    113113end;
    114114
    115115// Left(i) = 2*i+1.
    116116// Right(i) = 2*i+2 => Left(i)+1
    117 function TIPQ.Get(var Item, Value: integer): boolean; // O(lg(n))
     117function TIPQ.Get(var Item, Value: Integer): Boolean; // O(lg(n))
    118118var
    119   i, j: integer;
    120   last: TheapItem;
     119  I, J: Integer;
     120  Last: TheapItem;
    121121  lbh: PItemArray;
    122122begin
    123   if n = 0 then
     123  if N = 0 then
    124124  begin
    125     result := False;
    126     exit;
     125    Result := False;
     126    Exit;
    127127  end;
    128128
     
    133133  Ix[Item] := -1;
    134134
    135   dec(n);
    136   if n > 0 then
     135  Dec(N);
     136  if N > 0 then
    137137  begin
    138     last := lbh[n];
    139     i := 0;
    140     j := 1;
    141     while j < n do
     138    Last := lbh[N];
     139    I := 0;
     140    J := 1;
     141    while J < N do
    142142    begin
    143143      // Right(i) = Left(i)+1
    144       if (j < n - 1) and (lbh[j].Value > lbh[j + 1].Value) then
    145         Inc(j);
    146       if last.Value <= lbh[j].Value then
    147         break;
     144      if (J < N - 1) and (lbh[J].Value > lbh[J + 1].Value) then
     145        Inc(J);
     146      if Last.Value <= lbh[J].Value then
     147        Break;
    148148
    149       lbh[i] := lbh[j];
    150       Ix[lbh[i].Item] := i;
    151       i := j;
    152       j := j shl 1 + 1; // Left(j) = 2*j+1
     149      lbh[I] := lbh[J];
     150      Ix[lbh[I].Item] := I;
     151      I := J;
     152      J := J shl 1 + 1; // Left(j) = 2*j+1
    153153    end;
    154154
    155155    // Insert the root in the correct place in the heap.
    156     lbh[i] := last;
    157     Ix[last.Item] := i;
     156    lbh[I] := Last;
     157    Ix[Last.Item] := I;
    158158  end;
    159   result := True;
     159  Result := True;
    160160end;
    161161
Note: See TracChangeset for help on using the changeset viewer.