我正在编写一本编程书。 我写了一段代码但是我无法理解的一些步骤。
我创建的代码是一个名为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的新手。我希望得到你的帮助。
答案 0 :(得分:1)
这只是一个默认参数。它在代码执行时绑定一次,并允许函数的用户不显式设置它。如果在代码中设置它,用户必须在调用函数时设置它。
256只是一个数字。它可以很好地适应内存,这就是它被选中的原因。我记得Java
也使用2 ^ n尺寸作为HashMap
的支持桶,但是我不相信我的话。
我真的不明白你的例子。插入时和从地图中检索时使用哈希键 - 只是为了得到正确的桶。然后,您将对列表进行比较(因为存储桶实际上是列表)。
答案 1 :(得分:0)
(1)&amp; (2) 这是一个可选的输入参数,可以猜测一般使用的适当数量的存储桶。如果在没有参数的情况下调用“new”,则num_buckets将为256.如果提供了参数,则num_buckets将采用该值。
(3)我认为你可能对哈希有点混乱。散列函数的目的是提供对密钥进行编码的整数。散列值应该在整个给定的整数范围内扩展密钥集。例如,“九”可能映射到12; “十”可能会映射到301.后者将转换为45(301%256)。
根据你提供的数据,“十”将映射到键10,而不是1.你能解释你如何得到余数索引1吗?