sawine@5
|
1 |
"""
|
sawine@5
|
2 |
Author: Eugen Sawin <sawine@informatik.uni-freiburg.de>
|
sawine@5
|
3 |
"""
|
sawine@5
|
4 |
import math
|
sawine@5
|
5 |
|
sawine@5
|
6 |
def main():
|
sawine@5
|
7 |
args = parse_arguments()
|
sawine@5
|
8 |
if args.d:
|
sawine@5
|
9 |
probe = double_hash
|
sawine@5
|
10 |
elif args.l:
|
sawine@5
|
11 |
probe = linear_probing
|
sawine@5
|
12 |
elif args.q:
|
sawine@5
|
13 |
probe = quadratic_probing
|
sawine@5
|
14 |
else:
|
sawine@5
|
15 |
print "you need to select a probing procedure"
|
sawine@5
|
16 |
exit()
|
sawine@5
|
17 |
table = {}
|
sawine@5
|
18 |
for key in args.values.split():
|
sawine@5
|
19 |
table = hash(int(key), args.table_size, table, probe)
|
sawine@5
|
20 |
for k, v in table.iteritems():
|
sawine@5
|
21 |
print "%i: %i" % (k, v)
|
sawine@5
|
22 |
#print "%s: %i" % (key, double_hash(int(key), used))
|
sawine@5
|
23 |
|
sawine@5
|
24 |
def hash(k, size, table, probe):
|
sawine@5
|
25 |
j = 0
|
sawine@5
|
26 |
code = h(k, size) % size
|
sawine@5
|
27 |
while code in table:
|
sawine@5
|
28 |
j += 1
|
sawine@5
|
29 |
code = (h(k, size) - probe(j, k, size)) % size
|
sawine@5
|
30 |
table[code] = k
|
sawine@5
|
31 |
return table
|
sawine@5
|
32 |
|
sawine@5
|
33 |
def linear_probing(j, k, size):
|
sawine@5
|
34 |
return j
|
sawine@5
|
35 |
|
sawine@5
|
36 |
def quadratic_probing(j, k, size):
|
sawine@5
|
37 |
return (-1)**j * math.ceil(j/2.0)**2
|
sawine@5
|
38 |
|
sawine@5
|
39 |
def double_hash(j, k, size):
|
sawine@5
|
40 |
return j * h2(k, size)
|
sawine@5
|
41 |
|
sawine@5
|
42 |
def h(k, size):
|
sawine@5
|
43 |
return k % size
|
sawine@5
|
44 |
|
sawine@5
|
45 |
def h2(k, size):
|
sawine@5
|
46 |
return 1 + (k % (size - 2))
|
sawine@5
|
47 |
|
sawine@5
|
48 |
from argparse import ArgumentParser
|
sawine@5
|
49 |
|
sawine@5
|
50 |
def parse_arguments():
|
sawine@5
|
51 |
parser = ArgumentParser(description="Returns the hash for given string using the double-hash technique.")
|
sawine@5
|
52 |
parser.add_argument("table_size", type=int, help="size of the hash table")
|
sawine@5
|
53 |
parser.add_argument("values", help="values")
|
sawine@5
|
54 |
parser.add_argument("-d", action="store_true", help="double hashing")
|
sawine@5
|
55 |
parser.add_argument("-l", action="store_true", help="linear probing")
|
sawine@5
|
56 |
parser.add_argument("-q", action="store_true", help="quadratic probing")
|
sawine@5
|
57 |
return parser.parse_args()
|
sawine@5
|
58 |
|
sawine@5
|
59 |
if __name__ == "__main__":
|
sawine@5
|
60 |
main()
|