Added exams.
2 Name: perfect_hashing - applies the two-level scheme to build a perfect hash function
4 Description: Perfect Hashing builds a perfect hash function.
6 Author: Eugen Sawin <sawine@me73.com>
13 s = [int(e) for e in args.s.split(',')]
14 perfect_hashing(N, len(s), k, s)
17 return ((k*x) % N) % n
19 def find_ki(N, mi, Wi):
23 thx = hkx(N, mi, ki, x)
31 while not injective():
35 def perfect_hashing(N, n, k, 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)])
44 Wi = [thx[0][1] for thx in hx.iteritems() if thx[1] == i]
46 mi = 2 * bi * (bi - 1) + 1
48 ki = find_ki(N, mi, Wi)
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)
55 print "=> hk%i = (%i * x mod %i) mod %i" % (i, ki, N, mi)
60 posx = sl[i] + hkx(N, ml[i], kl[i], x)
61 print "x = %i => pos(%i) = %i" % (x, x, posx)
63 from argparse import ArgumentParser
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()
72 if __name__ == "__main__":