25.11.2014 Views

Algorithms and Data Structures

Algorithms and Data Structures

Algorithms and Data Structures

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

N.Wirth. <strong>Algorithms</strong> <strong>and</strong> <strong>Data</strong> <strong>Structures</strong>. Oberon version 185<br />

FOR i := a.m TO R+1 BY -1 DO a.e[i] := a.e[i-1] END;<br />

a.e[R] := u; INC(a.m)<br />

ELSE (*overflow; split a into a, b <strong>and</strong> assign the middle entry to v*)<br />

NEW(b);<br />

IF R < N THEN (*insert in left pate a*)<br />

v := a.e[N-1];<br />

FOR i := N-1 TO R+1 BY -1 DO a.e[i] := a.e[i-1] END;<br />

a.e[R] := u;<br />

FOR i := 0 TO N-1 DO b.e[i] := a.e[i+N] END<br />

ELSE (*insert in right page b*)<br />

DEC(R, N);<br />

IF R = 0 THEN<br />

v := u<br />

ELSE<br />

v := a.e[N];<br />

FOR i := 0 TO R-2 DO b.e[i] := a.e[i+N+1] END;<br />

b.e[R-1] := u<br />

END;<br />

FOR i := R TO N-1 DO b.e[i] := a.e[i+N] END<br />

END;<br />

a.m := N; b.m := N; b.p0 := v.p; v.p := b<br />

END<br />

END<br />

END<br />

END<br />

END insert;<br />

PROCEDURE underflow (c, a: Page; s: INTEGER; VAR h: BOOLEAN);<br />

(*a = underflow page, c = ancestor page,<br />

s = index of deleted entry in c*)<br />

VAR b: Page; i, k: INTEGER;<br />

BEGIN<br />

(*h & (a.m = N-1) & (c.e[s-1].p = a) *)<br />

IF s < c.m THEN (*b := page to the right of a*)<br />

b := c.e[s].p;<br />

k := (b.m-N+1) DIV 2; (*k = nof items available on page b*)<br />

a.e[N-1] := c.e[s]; a.e[N-1].p := b.p0;<br />

IF k > 0 THEN (*balance by moving k-1 items from b to a*)<br />

FOR i := 0 TO k-2 DO a.e[i+N] := b.e[i] END;<br />

c.e[s] := b.e[k-1]; b.p0 := c.e[s].p;<br />

c.e[s].p := b; DEC(b.m, k);<br />

FOR i := 0 TO b.m-1 DO b.e[i] := b.e[i+k] END;<br />

a.m := N-1+k; h := FALSE<br />

ELSE (*merge pages a <strong>and</strong> b, discard b*)<br />

FOR i := 0 TO N-1 DO a.e[i+N] := b.e[i] END;<br />

DEC(c.m);<br />

FOR i := s TO c.m-1 DO c.e[i] := c.e[i+1] END;<br />

a.m := 2*N; h := c.m < N<br />

END<br />

ELSE (*b := page to the left of a*)<br />

DEC(s);<br />

IF s = 0 THEN b := c.p0 ELSE b := c.e[s-1].p END;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!