有谁知道怎么做以及伪代码会是什么样的?
众所周知,哈希表存储键,值对,当键被调用时,该函数将返回与该键关联的值。我想要做的是理解创建映射函数的底层结构。例如,如果我们生活在除了数组之外没有先前定义的函数的世界中,我们怎么能复制我们今天拥有的Hashmaps?
答案 0 :(得分:22)
实际上,今天的一些Hashmap实现确实是由你提出的数组构成的。让我勾勒出这是如何工作的:
哈希函数 哈希函数将您的密钥转换为第一个数组(数组K)的索引。可以使用诸如MD5之类的哈希函数或者更简单的哈希函数(通常包括模运算符)。
<强>吊桶强> 一个简单的基于数组的Hashmap实现可以使用存储桶来处理碰撞。数组K中的每个元素('桶')本身包含一对数组(数组P)。添加或查询元素时,哈希函数将指向K中的正确存储桶,其中包含所需的数组P.然后,迭代P中的元素,直到找到匹配的键,或者在此处分配新元素。 P的结尾。
使用哈希将密钥映射到存储桶 你应该确保桶的数量(即K的大小)是2的幂,比如说2 ^ b。要为某个键找到正确的存储区索引,请计算哈希(键),但只保留前b位。这是转换为整数时的索引。
<强>重新标度强> 计算密钥的哈希并找到正确的桶非常快。但是一旦一个桶变得更饱满,你就必须迭代越来越多的物品才能找到合适的物品。因此,有足够的桶来正确分配对象很重要,否则你的Hashmap会变慢。
因为您通常不知道要预先在Hashmap中存储多少对象,所以需要动态增大或缩小地图。您可以保留存储的对象数量的计数,一旦超过某个阈值,您就可以重新创建整个结构,但这次使用更大或更小的数组K.这样K中的一些桶就是非常满,现在将它们的元素分成几个桶,这样性能会更好。
<强>替代强> 您也可以使用二维数组而不是数组数组,或者您可以将数组P替换为链接列表。此外,您可以简单地选择在其中一个存储桶包含多个配置数量的项目时重新创建(即重新调整)散列映射。而不是保留存储对象的总数。
您要求的变体在Hash table Wikipedia entry中被描述为“数组哈希表”。
<强>代码强> 对于代码示例,请查看here。
希望这有帮助。
答案 1 :(得分:0)
如果是这样,这里有一个Java示例(但这里的语言没有特别之处):
for (int i = 0; i < keysArray.length; i++) {
map.put(keysArray[i], valuesArray[i]);
}
当然,您必须实例化map
对象(如果您使用的是Java,我建议使用HashMap<Object, Object>
而不是过时的HashTable
),并测试您的数组,以避免null
个对象,并检查它们是否具有相同的大小。
答案 2 :(得分:0)
示例说明:
在以下来源,基本上它做了两件事:
示例:
List myhashmap [hash_table_size];
// an array of (short) lists
// if its long lists, then there are more collisions
注意:这是数组的数组,而不是两个数组(我只能看到一个可能的通用hashmap,只有2个数组)
如果您了解算法&gt; <图论>邻接列表,此看起来完全相同。
哈希函数将字符串(输入)转换为数字(哈希值),这是数组的索引
实施例,
int hash = input[0];
for (int i=1; i<input.length(); i++) {
hash = (hash << 4) + input[i]
}
hash = hash % list.size()
// list.size() here represents 1st dimension of (list of lists)
// that is 1st dimension size of our map representation from point #1
// which is hash_table_size
见第一个链接:
int HTable::hash (char const * str) const
来源:
http://www.relisoft.com/book/lang/pointer/8hash.html
How does a hash table work?
<强>更新强>
这是最好的来源:http://algs4.cs.princeton.edu/34hash/
答案 3 :(得分:-1)
你的意思是这样吗?
以下是使用Ruby的irb
作为例子:
cities = ["LA", "SF", "NY"]
=> ["LA", "SF", "NY"]
items = ["Big Mac", "Hot Fudge Sundae"]
=> ["Big Mac", "Hot Fudge Sundae"]
price = {}
=> {}
price[[cities[0], items[1]]] = 1.29
=> 1.29
price
=> {["LA", "Hot Fudge Sundae"]=>1.29}
price[[cities[0], items[0]]] = 2.49
=> 2.49
price[[cities[1], items[0]]] = 2.99
=> 2.99
price
=> {["LA", "Hot Fudge Sundae"]=>1.29, ["LA", "Big Mac"]=>2.49, ["SF", "Big Mac"]=>2.99}
price[["LA", "Big Mac"]]
=> 2.49