hashtables: switch to quadratic probing.

db4
John Benediktsson 2011-10-02 13:47:51 -07:00
parent 98e7793799
commit 4ad888b530
1 changed files with 18 additions and 18 deletions

View File

@ -17,21 +17,23 @@ TUPLE: hashtable
: hash@ ( key array -- i )
[ hashcode >fixnum dup fixnum+fast ] dip wrap ; inline
: probe ( array i -- array i )
2 fixnum+fast over wrap ; inline
: probe ( array i probe# -- array i' probe# )
2 fixnum+fast [ fixnum+fast over wrap ] keep ; inline
: no-key ( key array -- array n ? ) nip f f ; inline
: (key@) ( key array i -- array n ? )
3dup swap array-nth
dup ((empty)) eq?
[ 3drop no-key ] [
= [ rot drop t ] [ probe (key@) ] if
: (key@) ( key array i probe# -- array n ? )
[ 3dup swap array-nth ] dip over ((empty)) eq?
[ drop 3drop no-key ] [
[ = ] dip swap
[ drop rot drop t ]
[ probe (key@) ]
if
] if ; inline recursive
: key@ ( key hash -- array n ? )
array>> dup length>> 0 eq?
[ no-key ] [ 2dup hash@ (key@) ] if ; inline
[ no-key ] [ 2dup hash@ 0 (key@) ] if ; inline
: <hash-array> ( n -- array )
1 + next-power-of-2 4 * ((empty)) <array> ; inline
@ -42,19 +44,17 @@ TUPLE: hashtable
: reset-hash ( n hash -- )
swap <hash-array> >>array init-hash ; inline
: (new-key@) ( key keys i -- keys n empty? )
3dup swap array-nth dup ((empty)) eq? [
2drop rot drop t
] [
= [
rot drop f
] [
probe (new-key@)
] if
: (new-key@) ( key array i probe# -- array i empty? )
[ 3dup swap array-nth ] dip over ((empty)) eq?
[ 3drop rot drop t ] [
[ = ] dip swap
[ drop rot drop f ]
[ probe (new-key@) ]
if
] if ; inline recursive
: new-key@ ( key hash -- array n empty? )
array>> 2dup hash@ (new-key@) ; inline
array>> 2dup hash@ 0 (new-key@) ; inline
: set-nth-pair ( value key seq n -- )
2 fixnum+fast [ set-slot ] 2keep