- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对散列和重新散列有些困惑。以下是我的理解,如有错误请指正。
从图片上看,bucket实际上是Entry类的数组,以链表的形式存储元素。每个新的键值对,其键具有与条目数组桶相同的哈希码,将作为条目对象存储在存储该哈希码元素的桶中。如果 key 具有当前不存在于条目数组存储桶中的新哈希码,则将添加一个具有相应哈希码的新存储桶。
现在的问题是,实际重新散列何时发生?
情况 1:假设我有一个条目数组,其哈希码桶为 1,2 3,并在条目数组桶达到 12 时添加了新元素,但一旦出现哈希码为 13 的新元素(假设我在 hashcode 1 然后 2 等系列中添加元素),将创建一个新的 Map/Array of Entry Bucket(请说明是哪个),新容量将为 32,现在 Entry 数组可以保持不同32 个桶。
case 2:bucket dosent matter 的个数,HashMap 的默认容量为 16 意味着它可以在其中存储 16 个元素,dosent matter 在单个 bucket 中或无论如何。由于负载因子为 .75,一旦添加第 13 个元素,就会创建一个新的桶数组,其中包含 32 个,即现在所有链接列表中的总 Entry 节点可以是 32。
我认为情况 2 是正确的。请详细说明Re Hashing过程,如果能用这个图更好。
最佳答案
重新散列会根据当前存储在 HashMap
中的条目数增加可用桶的数量。
当 HashMap
实现确定应该增加桶的数量以维持预期的 O(1)
查找和插入性能时,它就会发生。
关于 .75 的默认加载因子以及它如何导致 HashMap
在添加第 13 个条目时重新散列,您是正确的。
但是,HashMap 的默认容量为 16 意味着它可以在其中存储 16 个元素的说法是不正确的
。任何桶都可以存储多个条目。但是,为了保持所需的性能,每个桶的平均条目数应该很小。这就是我们有负载因子的原因,也是我们应该使用适当的 hashCode()
来尽可能均匀地将键分布在桶中的原因。
关于java - 如何以及何时在 HashMap 中完成 Rehashing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44539023/
在某些时候我们需要增加散列的大小,通常我们只是重新散列,这会导致整个散列的重新构造。 有没有更好的解决方案,当我们增加尺寸时,我们不需要重新构造整个东西? 最佳答案 你可以使用 http://en.w
我正在实现一个哈希表,而不使用任何内置的 java HashTable 功能,并收到以下行的编译时错误: newHashTable.add(reHashValueIndex, bucket.get(j
我们有一个运行着多个数据库的 MySQL 服务器,用于不同类型的数据。其中之一是 wordpress 数据库。 我可以连接正常,“显示数据库”,“使用苹果”,“使用橙子”等(用水果代替我们的实际数据库
HashMap 的文档中有这样的短语: If the initial capacity is greater than the maximum number of entries divided by
我正在使用Kibana 4在ElasticSearch上查询唯一计数。 我想prevent rehash on field,,因为该字段已经被散列了。 如何使Kibana使用"rehash": fal
我对散列和重新散列有些困惑。以下是我的理解,如有错误请指正。 从图片上看,bucket实际上是Entry类的数组,以链表的形式存储元素。每个新的键值对,其键具有与条目数组桶相同的哈希码,将作为条目对象
我不明白为什么 hastable 的 rehash 复杂度在最坏的情况下可能是二次的: http://www.cplusplus.com/reference/unordered_set/unorder
我了解 unordered_ STL 容器保留多个桶,桶的数量根据容器中元素的数量而变化。插入时,如果超过一定的限制,容器将重新散列以使用更多的桶,因此每个桶都不太满并且搜索速度更快。这会使迭代器无效
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我们的数据库有很多表和很多列。命令行 mysql 客户端需要很长时间才能连接,除非我通过它 -A。我不想每次都输入它,所以我尝试添加 my.cnf 选项 no-auto-rehash。 在我必须使用
我试图让我的 Ruby 1.9.3 运行我的 Octopress 安装。 当我输入时: rbenv rehash 我遇到了一个错误: rbenv: cannot rehash: /Users/m
C++ unordered_map 的rehash() 和reserve() 方法有什么区别?为什么需要两种不同的方法? 最佳答案 区别在于目的,尽管两者都在做类似的事情。 rehash 获取现有映射
我不明白为什么它不是线性的。 关于多重集的类似问题有一个很好的答案: why hastable's rehash complexity may be quadratic in worst case 但
我正在将用户从遗留用户存储迁移到我的 ASP.NET 5.0 Web 应用程序中的 ASP.NET Identity 2.0。我有一种验证遗留哈希的方法,但我想在登录时将它们升级到 ASP.NET I
我正在尝试在安装新 gem 后重新哈希 rbenv它在我的 ubuntu 服务器上给了我这些错误 rbenv: cannot rehash: /home/deployer/.rbenv/shims/
我是一名优秀的程序员,十分优秀!