X-Git-Url: http://nitlanguage.org diff --git a/lib/perfect_hashing.nit b/lib/perfect_hashing.nit index 9ac59f3..9221116 100644 --- a/lib/perfect_hashing.nit +++ b/lib/perfect_hashing.nit @@ -24,23 +24,21 @@ class Perfecthashing # Union of interval for implementing perfect numbering # Represents the interval of free identifiers # A null value represents the upper bound of identifier - private var interval: List[Couple[nullable Int, nullable Int]] + private var interval = new List[Couple[nullable Int, nullable Int]] - # An array used as a temporary Hashtable for + # An array used as a temporary Hashtable for # checking there is no collision between identifiers - private var tempht: Array[nullable Int] + private var tempht = new Array[nullable Int] # Initialize the structure of free identifiers init do # By default, all identifiers are available - interval = new List[Couple[nullable Int, nullable Int]] - interval.push(new Couple[nullable Int, nullable Int](0, null)) - tempht = new Array[nullable Int] + interval.push(new Couple[nullable Int, nullable Int](1, null)) end - + # Returns a mask composed by discriminants bits - # for these given identifiers + # for these given identifiers # The mask + 1 value is the size of the hastable to create fun phand(ids: Array[Int]): Int do @@ -61,7 +59,7 @@ class Perfecthashing mask = orMask.bin_xor(andMask) # Re-initialize the hashtable with null values - for i in [0..mask+1] do tempht[i] = null + for i in [0..(mask+1)] do tempht[i] = null # Optimize the already computed mask var newmask = 0 @@ -69,7 +67,7 @@ class Perfecthashing while i != 0 do if mask.getbit(i) == 1 then newmask = mask.bin_xor(1.lshift(i)) - + # If there is no collision, replace the old mask if phandp(ids, newmask) then mask = newmask @@ -94,7 +92,7 @@ class Perfecthashing tempht[hv] = mask end end - + return true end @@ -123,6 +121,9 @@ class Perfecthashing end # Resetting hashtable + for j in [0..(mask+1)] do tempht[j] = null + + # Set the temporary hashtable for `compute_least_free_ids` phandp(ids, mask) # Fill the given array with n free identifiers @@ -157,7 +158,7 @@ class Perfecthashing # Tests if this id is free for this mask var hv = i.bin_and(mask) - # If the hashtable if full, push an empty item + # If the hashtable if full, push an empty item if hv >= tempht.length then tempht.push(null) end @@ -165,7 +166,7 @@ class Perfecthashing if tempht[hv] != mask then found = true id = i - end + end i = i + 1 end @@ -181,7 +182,7 @@ class Perfecthashing else inter.item.first += 1 end - else + else if id != inter.item.first and id != inter.item.second then # We need to split in two this interval var last = inter.item.second