如何在hashmap模块中解决一些问题?

时间:2015-09-11 20:00:23

标签: python hashmap

我正在编写一本编程书。 我写了一段代码但是我无法理解的一些步骤。

我创建的代码是一个名为hashmap的模块:

def new(num_buckets=256):
    """Initializes a Map with the given number of buckets."""
    aMap = []
    for i in range(0, num_buckets):
        aMap.append([])
    return aMap

def hash_key(aMap, key):
    """Given a key this will create a number and then convert it to
    an index for the aMap's buckets."""
    return hash(key) % len(aMap)

def get_bucket(aMap, key):
    """Given a key, find the bucket where it would go."""
    bucket_id = hash_key(aMap, key)
    return aMap[bucket_id]

def get_slot(aMap, key, default=None):
    """
    Returns the index, key, and value of a slot found in a bucket.
    Returns -1, key, and default (None if not set) when not found.
    """
    bucket = get_bucket(aMap, key)

    for i, kv in enumerate(bucket):
        k, v = kv
        if key == k:
            return i, k, v

    return -1, key, default

def get(aMap, key, default=None):
    """Gets the value in a bucket for the given key, or the default."""
    i, k, v = get_slot(aMap, key, default=default)
    return v

def set(aMap, key, value):
    """Sets the key to the value, replacing any existing value."""
    bucket = get_bucket(aMap, key)
    i, k, v = get_slot(aMap, key)

    if i >= 0:
        # the key exists, replace it
        bucket[i] = (key, value)
    else:
        # the key does not, append to create it
        bucket.append((key, value))

def delete(aMap, key):
    """Deletes the given key from the Map."""
    bucket = get_bucket(aMap, key)

    for i in xrange(len(bucket)):
        k, v = bucket[i]
        if key == k:
            del bucket[i]
            break

def list(aMap):
    """Prints out what's in the Map."""
    for bucket in aMap:
        if bucket:
            for k, v in bucket:
                print k, v

1)为什么在new(num_buckets=256)函数中有一个关键字作为参数? 如果我将num_buckets设置为变量并将256设置为函数中间的值,该怎么办?设置它在哪里重要?

def new():
    """Initializes a Map with the given number of buckets."""
    aMap = []
    num_buckets = 256              # <--- this line
    for i in range(0, num_buckets):
        aMap.append([])
    return aMap

2)为什么aMap的尺寸为256?它是故意还是偶然的数字?

3) hash_key(aMap, key)功能有什么意义? 这种方式并不能保证密钥在存储桶中具有“余数索引”。

  

例如。

aMap = [[(9, 'nine')], [(10, 'ten')], [11, 'eleven']]

运行函数hash_key后,“remaining-index”将为1。但是密钥10不在第一个桶中。

我是Python的新手。我希望得到你的帮助。

2 个答案:

答案 0 :(得分:1)

  1. 这只是一个默认参数。它在代码执行时绑定一次,并允许函数的用户不显式设置它。如果在代码中设置它,用户必须在调用函数时设置它。

  2. 256只是一个数字。它可以很好地适应内存,这就是它被选中的原因。我记得Java也使用2 ^ n尺寸作为HashMap的支持桶,但是我不相信我的话。

  3. 我真的不明白你的例子。插入时和从地图中检索时使用哈希键 - 只是为了得到正确的桶。然后,您将对列表进行比较(因为存储桶实际上是列表)。

答案 1 :(得分:0)

(1)&amp; (2) 这是一个可选的输入参数,可以猜测一般使用的适当数量的存储桶。如果在没有参数的情况下调用“new”,则num_buckets将为256.如果提供了参数,则num_buckets将采用该值。

(3)我认为你可能对哈希有点混乱。散列函数的目的是提供对密钥进行编码的整数。散列值应该在整个给定的整数范围内扩展密钥集。例如,“九”可能映射到12; “十”可能会映射到301.后者将转换为45(301%256)。

根据你提供的数据,“十”将映射到键10,而不是1.你能解释你如何得到余数索引1吗?