哈希地图课程和YouTube视频
总结:示例哈希图以供参考或克隆此仓库以与哈希图设置一起玩。
哈希映射是使用数组进行存储的另一种方法。 您将对象设置为数组中特定但无序的插槽(索引)。 每个键都是唯一的,因此这将允许快速查找时间来查找特定的键/值对。 您不通过索引访问,而是通过该唯一键访问。 您可以通过对键进行散列来决定将值存储在何处(我们将字符串用作示例键,但也可以很容易地使用数字或具有特殊字符的唯一ID)。 以下是哈希函数的示例。
静态_hashString(string){
令hash = 5381;
for(让i = 0; i <string.length; i ++){
哈希=(哈希<< 5)+哈希+字符串。charCodeAt(i);
哈希=哈希&哈希;
}
返回哈希值>>> 0;
}
一些最佳实践超出了了解此处执行操作所需的范围。 从本质上讲,您需要使用字符串并将其通过此函数传递以获得较大的数字。 如果设计正确,则哈希函数将始终在给定相同字符串的情况下返回相同的数字。 我最喜欢的部分是下一步。
const hash = _hashString(key);
const start = hash%this._capacity;
哈希图具有设置的最大容量,因此您可以使用此哈希和模数来获得介于0和哈希图数组长度之间的数字。 那就是您存储对象的索引。
问题是当您想将散列项添加到同一索引时。 这些将相互冲突,而我的实现只需在我们的slot数组中找到下一个开放索引就可以解决这个问题。 这称为“开放式寻址”。 如果您的程序需要比插入项目更频繁地查找项目,则此方法效果很好。 查找时间仍然非常有效。 但是,如果您经常插入,则将达到容量限制,然后必须更频繁地调整大小。 像普通阵列一样,在内存中查找新位置并重新分配整个地图在计算上更加昂贵。 因此,如果您需要经常插入,最好不要使用“开放地址”,而应使用“单独链接”。 与其在插槽数组中查找下一个打开的索引,不如在该位置设置链接列表,因此,如果发生冲突,只需将其添加到该位置的链接列表中即可。
编写一种算法,将单词列表分组为字谜。 例如,如果输入为[‘east’,’cars’,’acre’,’arcs’,’teas’,’eats’,’race’],则输出应为:[[‘east’,’teas ‘,’eats’],[‘cars’,’arcs’],[‘acre’,’race’]]。
带走:
请遵循此仓库中anagram.js中的注释。
哈希图使用起来很有趣,而且如果在正确的时间使用它也会带来好处。 与《指环王》角色一起练习时会更加有趣。 自我注意:以LoTR为例。