21 INTEGER,
PARAMETER ::
unused = -1
44 INTEGER :: default_value = 0
48 INTEGER :: longuest_probe = 0
52 REAL :: max_load_factor = 0.75
79 INTEGER,
INTENT(IN) :: TABLE_SIZE
83 ALLOCATE(ht%TABLE(p2), stat=ierr)
84 CALL check_allocate(ierr,
'HASH TABLE CREATION')
111 IF(
ALLOCATED(ht%TABLE))
DEALLOCATE(ht%TABLE)
133 INTEGER,
INTENT(IN) :: X
147 &(x,y) result(pairing)
164 INTEGER,
INTENT(IN) :: X,Y
165 INTEGER(KIND=K8) :: PAIRING
168 pairing = int(x, kind=
k8) * x + x + y
178 &(k, table_size) result(h)
195 INTEGER(KIND=K8),
INTENT(IN) :: K
196 INTEGER,
INTENT(IN) :: TABLE_SIZE
226 INTEGER(KIND=K8),
INTENT(IN) :: K
227 INTEGER(KIND=K8),
INTENT(IN) :: S
229 INTEGER(KIND=K8)::KMUL
230 INTEGER(KIND=K8) :: B
236 DOUBLE PRECISION,
PARAMETER :: A=(2.2360679774d0-1d0)/2d0
239 h=floor(dble(s) * dmod(dble(k)*a,1d0))
245 b = ieor(b, ishft(b,44))
247 b = ieor(b, ishft(b,41))
291 INTEGER,
INTENT(IN) :: X,Y,V
292 INTEGER :: I, PROBE_SIZE
293 INTEGER(KIND=K8) :: K
295 IF(x < 0 .OR. y < 0)
THEN 296 WRITE(
lu,*)
'X AND Y MUST BE POSITIVE' 297 CALL plante(1,
'MOD_HASH_TABLE')
301 IF(
REAL(ht%nelts)/SIZE(ht%table)>HT%MAX_LOAD_FACTOR) then
308 i =
hash(k,
SIZE(ht%TABLE))
312 DO WHILE (ht%TABLE(i)%X /=
unused)
315 IF(ht%TABLE(i)%X == x .AND. ht%TABLE(i)%Y == y)
EXIT 318 probe_size = probe_size+1
322 IF(i>
SIZE(ht%TABLE)) i=1
329 IF(ht%LONGUEST_PROBE < probe_size)
THEN 330 ht%LONGUEST_PROBE=probe_size
333 ht%NELTS = ht%NELTS+1
339 &(ht, x, y) result(v)
359 INTEGER,
INTENT(IN) :: X, Y
361 INTEGER(KIND=K8) :: K
363 IF(x < 0 .OR. y < 0)
THEN 364 WRITE(
lu,*)
'X AND Y MUST BE POSITIVE' 365 CALL plante(1,
'MOD_HASH_TABLE')
371 i =
hash(k,
SIZE(ht%TABLE))
373 DO WHILE(ht%TABLE(i)%X /=
unused)
374 IF(ht%TABLE(i)%X == x .AND. ht%TABLE(i)%Y == y)
THEN 379 IF(i>
SIZE(ht%TABLE)) i = 1
407 DO i=1,
SIZE(ht%TABLE)
408 IF(ht%TABLE(i)%X /=
unused)
THEN 410 & ht%TABLE(i)%X, ht%TABLE(i)%Y, ht%TABLE(i)%V)
415 ALLOCATE(ht%TABLE(
SIZE(new_ht%TABLE)))
416 ht%TABLE = new_ht%TABLE
417 DEALLOCATE(new_ht%TABLE)
419 CALL move_alloc(new_ht%TABLE, ht%TABLE)
421 ht%LONGUEST_PROBE = new_ht%LONGUEST_PROBE
445 WRITE(
lu,*)
'LARGEST NO. OF COLLISIONS',ht%LONGUEST_PROBE
446 WRITE(
lu,*)
'NUMBER OF BUCKETS:',
SIZE(ht%TABLE)
447 WRITE(
lu,*)
'NUMBER OF ELEMENTS:',ht%NELTS
479 WRITE(
lu,*)
'FOUND',v,
'SHOULD HAVE BEEN 10' 480 CALL plante(1,
'MOD_HASH_TABLE')
487 WRITE(
lu,*)
'FOUND',v,
'SHOULD HAVE BEEN -10' 488 CALL plante(1,
'MOD_HASH_TABLE')
495 WRITE(
lu,*)
'FOUND',v,
'SHOULD HAVE BEEN 42' 496 CALL plante(1,
'MOD_HASH_TABLE')
506 WRITE(
lu,*)
'FOUND',v,
'SHOULD HAVE BEEN',i
507 CALL plante(1,
'MOD_HASH_TABLE')
515 WRITE(
lu,*)
'FOUND',v,
'SHOULD HAVE BEEN 2017' 516 CALL plante(1,
'MOD_HASH_TABLE')
521 WRITE(
lu,*)
'HASH_TABLE: ALL TEST PASSED'
subroutine hash_table_create(HT, TABLE_SIZE)
subroutine hash_table_stat(HT)
pure integer(kind=k8) function elegant_pairing(X, Y)
subroutine hash_table_test()
integer, parameter unused
pure integer function nearest_superior_power_2(X)
pure integer function fingerprint(K, S)
integer function hash_table_get(HT, X, Y)
subroutine hash_table_destroy(HT)
recursive subroutine hash_table_insert(HT, X, Y, V)
pure integer function hash(K, TABLE_SIZE)
subroutine hash_table_grow(HT)