src/open_addressing.py
author Eugen Sawin <sawine@me73.com>
Mon, 18 Jul 2011 20:17:25 +0200
changeset 13 becb48258245
permissions -rw-r--r--
First part of ex 9.
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()