我非常坚持这个练习,所以我会很感激你的答案。
问题:
在什么时候添加到aDict数组的键?我只能看到创建的键的索引被添加到数组中。 (返回aDict [bucket-id]?)
我正在看这段代码:
module Dict
def Dict.new(num_buckets = 256)
#Initializes Dict with the given number of buckets.
aDict = []
(0...num_buckets).each do |i|
aDict.push([])
end
return aDict
end
def Dict.hash_key(aDict,key)
#given a key this will create a number
#turning it into an index for one of aDicts buckets
return key.hash % aDict.length
end
def Dict.get_bucket(aDict, key)
#Given a key, find the bucket where it would go.
bucket_id = Dict.hash_key(aDict,key)
return aDict[bucket_id]
end
def Dict.get_slot(aDict, key, default=nil)
#Returns the index, key and
#value of a slot found in a bucket.
bucket = Dict.get_bucket(aDict,key)
bucket.each_with_index do |kv, i|
k, v = kv
if key == k
return i, k, v
end
end
return -1, key, default
end
def Dict.get(aDict, key, value)
#Gets the value in a bucket for the given key or the default
i, k, v = Dict.get_slot (aDict,key, Value, default = default)
return v
end
def Dict.set(aDict,key,value)
#Sets the key to the value,
#replacing any existing value.
bucket = Dict.get_bucket(aDict, key)
i,k,v = Dict.get_slot(aDict, key)
if [i] >= 0
bucket[i] = [key,value]
else
bucket.push([key,value])
end
end
假设我将Dict.rb导入另一个文件,我想让它运行:
require .\dict.rb
#create mapping of state to abbreviation
states Dict.new()
Dict.set( states, Oregon, OR)
桶中的密钥(俄勒冈州)何时可以由aDict [bucket_id]返回?
答案 0 :(得分:0)
好的,首先哈希表aDict
的结构看起来像这样,里面有一些键:
[0] => [[k1, v1], [k2, v2]]
[1] => [[k3, v3]]
[2] => []
0,1,2
是指数。在每个索引位置,您有另一个数组, this 数组的每个元素都是一个包含键和值的双元素数组。例如,这意味着k3
位于aDict[1][0][0]
因此,当您想在哈希中插入键和值时,会调用Dict.set
方法
def Dict.set(aDict,key,value)
#Sets the key to the value,
#replacing any existing value.
bucket = Dict.get_bucket(aDict, key)
get_bucket
通过将密钥散列的mod与数组的大小一起计算第一个索引。然后它返回存储在该索引处的数组。 (例如:bucket = aDict[1]
)
i,k,v = Dict.get_slot(aDict, key)
get_slot
找出bucket
数组中哪个索引包含您的密钥,并返回索引号以及键和值。如果它不存在,则返回-1表示没有索引,键和默认值(nil
)
(例如:i, k, v
将为0, k3, v3
,因为[k3, v3]
位于aDict[1][0]
。如果您正在寻找k4
,i, k, v
会已经-1, k4, nil
)
if i >= 0
bucket[i] = [key,value]
else
bucket.push([key,value])
end
end
这一点很简单。如果i
不是-1,那么使用键和值更新位置,否则在数组末尾推送新的两个元素数组。