examples/perfect_hashing.py
author Eugen Sawin <sawine@me73.com>
Sat, 05 Mar 2011 13:14:25 +0100
changeset 7 f3cc763e23d0
permissions -rw-r--r--
Added exams.
     1 """
     2 Name: perfect_hashing - applies the two-level scheme to build a perfect hash function
     3 
     4 Description: Perfect Hashing builds a perfect hash function.
     5 
     6 Author: Eugen Sawin <sawine@me73.com>
     7 """
     8 
     9 def main():
    10 	args = parse_args()
    11 	N = args.n
    12 	k = args.k
    13 	s = [int(e) for e in args.s.split(',')]
    14 	perfect_hashing(N, len(s), k, s)
    15 
    16 def hkx(N, n, k, x):
    17 	return ((k*x) % N) % n
    18 
    19 def find_ki(N, mi, Wi):
    20 	def injective():
    21 		hx = []
    22 		for x in Wi:
    23 			thx = hkx(N, mi, ki, x)
    24 			if thx in hx:
    25 				return False
    26 			else:
    27 				hx.append(thx)
    28 		return True
    29 
    30 	ki = 1
    31 	while not injective():
    32 		ki += 1
    33 	return ki
    34 
    35 def perfect_hashing(N, n, k, xi):
    36 	hx = {}
    37 	for x in xi:
    38 		hx[(k, x)] = hkx(N, n, k, x)
    39 		print "h%i(%i) = (%i * %i mod %i) mod %i = %i" % (k, x, k, x, N, n, hx[(k,x)])	
    40 	ml = []
    41 	sl = [] 
    42 	kl = []
    43 	for i in xrange(n):
    44 		Wi = [thx[0][1] for thx in hx.iteritems() if thx[1] == i]
    45 		bi = len(Wi)
    46 		mi = 2 * bi * (bi - 1) + 1
    47 		si = sum(ml)
    48 		ki = find_ki(N, mi, Wi)
    49 		ml.append(mi)
    50 		sl.append(si)
    51 		kl.append(ki)
    52 		print "\nW%i = " % i, Wi
    53 		print "=> b%i = %i" % (i, bi), "m%i = %i" % (i, mi), "s%i = %i" % (i, si), "k%i = %i" % (i, ki)
    54 		if bi > 1:
    55 			print "=> hk%i = (%i * x mod %i) mod %i" % (i, ki, N, mi)
    56 
    57 	print
    58 	for x in xi:
    59 		i = hx[(k, x)]
    60 		posx = sl[i] + hkx(N, ml[i], kl[i], x)
    61 		print "x = %i => pos(%i) = %i" % (x, x, posx)
    62 
    63 from argparse import ArgumentParser
    64 
    65 def parse_args():
    66     parser = ArgumentParser(description='Builds a perfect hash function.')
    67     parser.add_argument('n', type=int, help='size of the universe U')
    68     parser.add_argument('k', type=int, help='parameter k of the hash function')
    69     parser.add_argument('s', help='comma-separated values defining the given set S')
    70     return parser.parse_args()
    71 
    72 if __name__ == "__main__":
    73 	main()