Hex Artifact Content
Not logged in

Artifact 50392f771d3f3608cee646b3944c22f9b0ae4a89:


0000: 5c 20 62 69 6e 61 72 79 20 68 65 61 70 0a 0a 72  \ binary heap..r
0010: 65 71 75 69 72 65 20 6d 69 6e 69 2d 6f 6f 66 2e  equire mini-oof.
0020: 66 73 0a 0a 5b 64 65 66 69 6e 65 64 5d 20 6e 74  fs..[defined] nt
0030: 69 6d 65 20 30 3d 20 5b 49 46 5d 0a 20 20 20 20  ime 0= [IF].    
0040: 6c 69 62 72 61 72 79 3a 20 6c 69 62 72 74 2e 73  library: librt.s
0050: 6f 2e 31 0a 20 20 20 20 65 78 74 65 72 6e 3a 20  o.1.    extern: 
0060: 69 6e 74 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d  int clock_gettim
0070: 65 20 28 20 69 6e 74 20 2c 20 69 6e 74 20 29 3b  e ( int , int );
0080: 0a 0a 20 20 20 20 32 56 61 72 69 61 62 6c 65 20  ..    2Variable 
0090: 74 69 6d 65 73 70 65 63 0a 20 20 20 20 3a 20 6e  timespec.    : n
00a0: 74 69 6d 65 20 28 20 2d 2d 20 64 20 29 20 20 30  time ( -- d )  0
00b0: 20 74 69 6d 65 73 70 65 63 20 63 6c 6f 63 6b 5f   timespec clock_
00c0: 67 65 74 74 69 6d 65 20 64 72 6f 70 0a 09 74 69  gettime drop..ti
00d0: 6d 65 73 70 65 63 20 32 40 20 23 31 30 30 30 30  mespec 2@ #10000
00e0: 30 30 30 30 30 20 75 6d 2a 20 72 6f 74 20 30 20  00000 um* rot 0 
00f0: 64 2b 20 3b 0a 5b 54 48 45 4e 5d 0a 0a 5c 20 61  d+ ;.[THEN]..\ a
0100: 20 62 69 6e 61 72 79 20 68 65 61 70 20 69 73 20   binary heap is 
0110: 61 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b  a structure to k
0120: 65 65 70 20 61 20 70 61 72 74 69 61 6c 6c 79 20  eep a partially 
0130: 73 6f 72 74 65 64 20 73 65 74 0a 5c 20 73 6f 20  sorted set.\ so 
0140: 74 68 61 74 20 79 6f 75 20 63 61 6e 20 65 61 73  that you can eas
0150: 69 6c 79 20 69 6e 73 65 72 74 20 65 6c 65 6d 65  ily insert eleme
0160: 6e 74 73 2c 20 61 6e 64 20 65 78 74 72 61 63 74  nts, and extract
0170: 20 74 68 65 20 6c 65 61 73 74 20 65 6c 65 6d 65   the least eleme
0180: 6e 74 0a 0a 6f 62 6a 65 63 74 20 63 6c 61 73 73  nt..object class
0190: 0a 20 20 20 20 63 65 6c 6c 20 76 61 72 20 68 61  .    cell var ha
01a0: 72 72 61 79 0a 20 20 20 20 63 65 6c 6c 20 76 61  rray.    cell va
01b0: 72 20 68 73 69 7a 65 0a 20 20 20 20 63 65 6c 6c  r hsize.    cell
01c0: 20 76 61 72 20 68 6d 61 78 73 69 7a 65 0a 20 20   var hmaxsize.  
01d0: 20 20 6d 65 74 68 6f 64 20 68 6c 65 73 73 0a 20    method hless. 
01e0: 20 20 20 6d 65 74 68 6f 64 20 68 73 77 61 70 0a     method hswap.
01f0: 20 20 20 20 6d 65 74 68 6f 64 20 68 63 65 6c 6c      method hcell
0200: 0a 20 20 20 20 6d 65 74 68 6f 64 20 68 65 61 70  .    method heap
0210: 40 0a 20 20 20 20 6d 65 74 68 6f 64 20 68 65 61  @.    method hea
0220: 70 21 0a 20 20 20 20 6d 65 74 68 6f 64 20 2e 68  p!.    method .h
0230: 0a 65 6e 64 2d 63 6c 61 73 73 20 68 65 61 70 0a  .end-class heap.
0240: 0a 3a 6e 6f 6e 61 6d 65 20 28 20 69 31 20 69 32  .:noname ( i1 i2
0250: 20 68 65 61 70 20 2d 2d 20 66 6c 61 67 20 29 0a   heap -- flag ).
0260: 20 20 20 20 68 61 72 72 61 79 20 40 20 74 75 63      harray @ tuc
0270: 6b 20 2b 20 40 20 3e 72 20 2b 20 40 20 72 3e 20  k + @ >r + @ r> 
0280: 3c 20 3b 20 68 65 61 70 20 64 65 66 69 6e 65 73  < ; heap defines
0290: 20 68 6c 65 73 73 0a 3a 6e 6f 6e 61 6d 65 20 28   hless.:noname (
02a0: 20 69 31 20 69 32 20 68 65 61 70 20 2d 2d 20 29   i1 i2 heap -- )
02b0: 0a 20 20 20 20 68 61 72 72 61 79 20 40 20 74 75  .    harray @ tu
02c0: 63 6b 20 2b 20 3e 72 20 2b 20 72 3e 20 7b 20 69  ck + >r + r> { i
02d0: 31 20 69 32 20 7d 0a 20 20 20 20 69 31 20 40 20  1 i2 }.    i1 @ 
02e0: 69 32 20 40 20 20 69 31 20 21 20 69 32 20 21 20  i2 @  i1 ! i2 ! 
02f0: 3b 20 68 65 61 70 20 64 65 66 69 6e 65 73 20 68  ; heap defines h
0300: 73 77 61 70 0a 3a 6e 6f 6e 61 6d 65 20 64 72 6f  swap.:noname dro
0310: 70 20 2e 20 3b 20 68 65 61 70 20 64 65 66 69 6e  p . ; heap defin
0320: 65 73 20 2e 68 0a 3a 6e 6f 6e 61 6d 65 20 64 72  es .h.:noname dr
0330: 6f 70 20 63 65 6c 6c 20 3b 20 68 65 61 70 20 64  op cell ; heap d
0340: 65 66 69 6e 65 73 20 68 63 65 6c 6c 0a 3a 6e 6f  efines hcell.:no
0350: 6e 61 6d 65 20 64 72 6f 70 20 40 20 3b 20 68 65  name drop @ ; he
0360: 61 70 20 64 65 66 69 6e 65 73 20 68 65 61 70 40  ap defines heap@
0370: 0a 3a 6e 6f 6e 61 6d 65 20 64 72 6f 70 20 21 20  .:noname drop ! 
0380: 3b 20 68 65 61 70 20 64 65 66 69 6e 65 73 20 68  ; heap defines h
0390: 65 61 70 21 0a 0a 3a 20 68 6e 65 77 20 28 20 2d  eap!..: hnew ( -
03a0: 2d 20 68 65 61 70 20 29 0a 20 20 20 20 68 65 61  - heap ).    hea
03b0: 70 20 6e 65 77 20 3e 72 0a 20 20 20 20 72 40 20  p new >r.    r@ 
03c0: 68 63 65 6c 6c 20 64 75 70 20 72 40 20 68 6d 61  hcell dup r@ hma
03d0: 78 73 69 7a 65 20 21 20 30 20 72 40 20 68 73 69  xsize ! 0 r@ hsi
03e0: 7a 65 20 21 0a 20 20 20 20 61 6c 6c 6f 63 61 74  ze !.    allocat
03f0: 65 20 74 68 72 6f 77 20 72 40 20 68 61 72 72 61  e throw r@ harra
0400: 79 20 21 20 72 3e 20 3b 0a 0a 3a 20 68 72 65 73  y ! r> ;..: hres
0410: 69 7a 65 3e 20 28 20 68 65 61 70 20 2d 2d 20 29  ize> ( heap -- )
0420: 20 3e 72 0a 20 20 20 20 72 40 20 68 6d 61 78 73   >r.    r@ hmaxs
0430: 69 7a 65 20 40 20 72 40 20 68 73 69 7a 65 20 40  ize @ r@ hsize @
0440: 20 75 3c 20 49 46 0a 09 72 40 20 68 61 72 72 61   u< IF..r@ harra
0450: 79 20 40 0a 09 72 40 20 68 6d 61 78 73 69 7a 65  y @..r@ hmaxsize
0460: 20 40 20 32 2a 20 64 75 70 20 72 40 20 68 6d 61   @ 2* dup r@ hma
0470: 78 73 69 7a 65 20 21 20 72 65 73 69 7a 65 20 74  xsize ! resize t
0480: 68 72 6f 77 0a 09 72 40 20 68 61 72 72 61 79 20  hrow..r@ harray 
0490: 21 0a 20 20 20 20 54 48 45 4e 20 72 3e 20 64 72  !.    THEN r> dr
04a0: 6f 70 20 3b 0a 0a 3a 20 68 72 65 73 69 7a 65 3c  op ;..: hresize<
04b0: 20 28 20 68 65 61 70 20 2d 2d 20 29 20 3e 72 0a   ( heap -- ) >r.
04c0: 20 20 20 20 72 40 20 68 6d 61 78 73 69 7a 65 20      r@ hmaxsize 
04d0: 40 20 32 2f 20 72 40 20 68 73 69 7a 65 20 40 20  @ 2/ r@ hsize @ 
04e0: 75 3e 20 49 46 0a 09 72 40 20 68 61 72 72 61 79  u> IF..r@ harray
04f0: 20 40 0a 09 72 40 20 68 6d 61 78 73 69 7a 65 20   @..r@ hmaxsize 
0500: 40 20 32 2f 20 64 75 70 20 72 40 20 68 6d 61 78  @ 2/ dup r@ hmax
0510: 73 69 7a 65 20 21 20 72 65 73 69 7a 65 20 74 68  size ! resize th
0520: 72 6f 77 0a 09 72 40 20 68 61 72 72 61 79 20 21  row..r@ harray !
0530: 0a 20 20 20 20 54 48 45 4e 20 72 3e 20 64 72 6f  .    THEN r> dro
0540: 70 20 3b 0a 0a 3a 20 62 75 62 62 6c 65 2d 75 70  p ;..: bubble-up
0550: 20 28 20 69 6e 64 65 78 20 68 65 61 70 20 2d 2d   ( index heap --
0560: 20 29 0a 20 20 20 20 64 75 70 20 68 63 65 6c 6c   ).    dup hcell
0570: 20 30 20 7b 20 69 6e 64 65 78 20 68 65 61 70 20   0 { index heap 
0580: 73 69 7a 65 20 69 6e 64 65 78 2f 32 20 7d 0a 20  size index/2 }. 
0590: 20 20 20 42 45 47 49 4e 0a 09 69 6e 64 65 78 20     BEGIN..index 
05a0: 73 69 7a 65 20 2f 20 31 2d 20 32 2f 20 73 69 7a  size / 1- 2/ siz
05b0: 65 20 2a 20 64 75 70 20 74 6f 20 69 6e 64 65 78  e * dup to index
05c0: 2f 32 20 30 3c 20 30 3d 20 57 48 49 4c 45 0a 09  /2 0< 0= WHILE..
05d0: 20 20 20 20 69 6e 64 65 78 20 69 6e 64 65 78 2f      index index/
05e0: 32 20 68 65 61 70 20 68 6c 65 73 73 20 20 57 48  2 heap hless  WH
05f0: 49 4c 45 0a 09 09 69 6e 64 65 78 20 69 6e 64 65  ILE...index inde
0600: 78 2f 32 20 68 65 61 70 20 68 73 77 61 70 0a 09  x/2 heap hswap..
0610: 09 69 6e 64 65 78 20 69 6e 64 65 78 2f 32 20 74  .index index/2 t
0620: 6f 20 69 6e 64 65 78 0a 20 20 20 20 30 3d 20 55  o index.    0= U
0630: 4e 54 49 4c 20 20 54 48 45 4e 20 54 48 45 4e 20  NTIL  THEN THEN 
0640: 3b 0a 0a 3a 20 68 69 6e 73 65 72 74 20 28 20 2e  ;..: hinsert ( .
0650: 2e 2e 20 68 65 61 70 20 2d 2d 20 29 20 7b 20 68  .. heap -- ) { h
0660: 65 61 70 20 7d 0a 20 20 20 20 68 65 61 70 20 68  eap }.    heap h
0670: 73 69 7a 65 20 40 20 64 75 70 20 3e 72 0a 20 20  size @ dup >r.  
0680: 20 20 68 65 61 70 20 68 63 65 6c 6c 20 68 65 61    heap hcell hea
0690: 70 20 68 73 69 7a 65 20 2b 21 20 68 65 61 70 20  p hsize +! heap 
06a0: 68 72 65 73 69 7a 65 3e 0a 20 20 20 20 68 65 61  hresize>.    hea
06b0: 70 20 68 61 72 72 61 79 20 40 20 2b 20 68 65 61  p harray @ + hea
06c0: 70 20 68 65 61 70 21 0a 20 20 20 20 72 3e 20 68  p heap!.    r> h
06d0: 65 61 70 20 62 75 62 62 6c 65 2d 75 70 20 3b 0a  eap bubble-up ;.
06e0: 0a 3a 20 62 75 62 62 6c 65 2d 64 6f 77 6e 20 28  .: bubble-down (
06f0: 20 68 65 61 70 20 2d 2d 20 29 20 30 20 73 77 61   heap -- ) 0 swa
0700: 70 0a 20 20 20 20 64 75 70 20 68 63 65 6c 6c 20  p.    dup hcell 
0710: 6f 76 65 72 20 68 73 69 7a 65 20 40 20 30 20 7b  over hsize @ 0 {
0720: 20 69 6e 64 65 78 20 68 65 61 70 20 73 69 7a 65   index heap size
0730: 20 68 73 69 7a 65 20 69 6e 64 65 78 2a 32 20 7d   hsize index*2 }
0740: 0a 20 20 20 20 42 45 47 49 4e 0a 09 69 6e 64 65  .    BEGIN..inde
0750: 78 20 64 75 70 20 32 2a 20 73 69 7a 65 20 2b 20  x dup 2* size + 
0760: 74 6f 20 69 6e 64 65 78 2a 32 0a 09 69 6e 64 65  to index*2..inde
0770: 78 2a 32 20 68 73 69 7a 65 20 75 3c 20 20 57 48  x*2 hsize u<  WH
0780: 49 4c 45 0a 09 20 20 20 20 69 6e 64 65 78 20 69  ILE..    index i
0790: 6e 64 65 78 2a 32 20 68 65 61 70 20 68 6c 65 73  ndex*2 heap hles
07a0: 73 20 30 3d 20 49 46 0a 09 09 64 72 6f 70 20 69  s 0= IF...drop i
07b0: 6e 64 65 78 2a 32 20 20 54 48 45 4e 0a 09 20 20  ndex*2  THEN..  
07c0: 20 20 69 6e 64 65 78 2a 32 20 73 69 7a 65 20 2b    index*2 size +
07d0: 20 68 73 69 7a 65 20 75 3c 20 20 49 46 0a 09 09   hsize u<  IF...
07e0: 64 75 70 20 69 6e 64 65 78 2a 32 20 73 69 7a 65  dup index*2 size
07f0: 20 2b 20 68 65 61 70 20 68 6c 65 73 73 20 30 3d   + heap hless 0=
0800: 20 49 46 0a 09 09 20 20 20 20 64 72 6f 70 20 69   IF...    drop i
0810: 6e 64 65 78 2a 32 20 73 69 7a 65 20 2b 20 20 54  ndex*2 size +  T
0820: 48 45 4e 20 20 54 48 45 4e 0a 09 20 20 20 20 69  HEN  THEN..    i
0830: 6e 64 65 78 20 6f 76 65 72 20 20 68 65 61 70 20  ndex over  heap 
0840: 68 73 77 61 70 0a 09 20 20 20 20 64 75 70 20 69  hswap..    dup i
0850: 6e 64 65 78 20 3d 20 73 77 61 70 20 74 6f 20 69  ndex = swap to i
0860: 6e 64 65 78 0a 09 55 4e 54 49 4c 20 20 45 58 49  ndex..UNTIL  EXI
0870: 54 20 20 54 48 45 4e 20 64 72 6f 70 20 3b 0a 0a  T  THEN drop ;..
0880: 3a 20 68 64 65 6c 65 74 65 20 28 20 68 65 61 70  : hdelete ( heap
0890: 20 2d 2d 20 2e 2e 2e 20 29 20 3e 72 0a 20 20 20   -- ... ) >r.   
08a0: 20 72 40 20 68 73 69 7a 65 20 40 20 30 3d 20 61   r@ hsize @ 0= a
08b0: 62 6f 72 74 22 20 68 65 61 70 20 65 6d 70 74 79  bort" heap empty
08c0: 22 0a 20 20 20 20 72 40 20 68 61 72 72 61 79 20  ".    r@ harray 
08d0: 40 20 72 40 20 68 65 61 70 40 0a 20 20 20 20 72  @ r@ heap@.    r
08e0: 40 20 68 63 65 6c 6c 20 6e 65 67 61 74 65 20 72  @ hcell negate r
08f0: 40 20 68 73 69 7a 65 20 2b 21 0a 20 20 20 20 72  @ hsize +!.    r
0900: 40 20 68 61 72 72 61 79 20 40 20 72 40 20 68 73  @ harray @ r@ hs
0910: 69 7a 65 20 40 20 2b 20 72 40 20 68 65 61 70 40  ize @ + r@ heap@
0920: 20 72 40 20 68 61 72 72 61 79 20 40 20 72 40 20   r@ harray @ r@ 
0930: 68 65 61 70 21 0a 20 20 20 20 72 40 20 68 72 65  heap!.    r@ hre
0940: 73 69 7a 65 3c 0a 20 20 20 20 72 3e 20 62 75 62  size<.    r> bub
0950: 62 6c 65 2d 64 6f 77 6e 20 3b 0a 0a 3a 20 68 73  ble-down ;..: hs
0960: 69 7a 65 40 20 28 20 68 65 61 70 20 2d 2d 20 29  ize@ ( heap -- )
0970: 0a 20 20 20 20 64 75 70 20 68 73 69 7a 65 20 40  .    dup hsize @
0980: 20 73 77 61 70 20 68 63 65 6c 6c 20 2f 20 3b 0a   swap hcell / ;.
0990: 0a 3a 20 2e 68 65 61 70 20 7b 20 68 65 61 70 20  .: .heap { heap 
09a0: 2d 2d 20 7d 0a 20 20 20 20 68 65 61 70 20 68 61  -- }.    heap ha
09b0: 72 72 61 79 20 40 20 68 65 61 70 20 68 73 69 7a  rray @ heap hsiz
09c0: 65 20 40 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09  e @ bounds ?DO..
09d0: 49 20 68 65 61 70 20 68 65 61 70 40 20 68 65 61  I heap heap@ hea
09e0: 70 20 2e 68 0a 20 20 20 20 68 65 61 70 20 68 63  p .h.    heap hc
09f0: 65 6c 6c 20 2b 4c 4f 4f 50 20 3b 0a              ell +LOOP ;.