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