为什么哈希表扩展通常通过将大小加倍来完成?

2023-12-19

我对哈希表做了一些研究,并且我一直遵循经验法则,即当存在一定数量的条目(最大数量或通过负载因子(例如 75%))时,应该扩展哈希表。

几乎总是建议将哈希表的大小加倍(或加倍加 1,即 2n+1)。然而,我一直没能找到一个很好的理由。

为什么要加倍大小,而不是增加 25%,或者增加到下一个素数或下一个 k 个素数(例如,3)的大小?

我已经知道,选择一个质数作为初始哈希表大小通常是一个好主意,至少如果您的哈希函数使用通用哈希等模数的话。我知道这就是为什么通常建议执行 2n+1 而不是 2n (例如,http://www.concentric.net/~Ttwang/tech/hashsize.htm http://www.concentric.net/~Ttwang/tech/hashsize.htm)

然而,正如我所说,我还没有看到任何真正的解释为什么加倍或加倍加一实际上是一个不错的选择,而不是选择新哈希表大小的其他方法。

(是的,我读过有关哈希表的维基百科文章:)http://en.wikipedia.org/wiki/Hash_table http://en.wikipedia.org/wiki/Hash_table


例如,如果调整大小是通过恒定增量进行的,则哈希表不能声明“摊销恒定时间插入”。在这种情况下,调整大小的成本(随着哈希表的大小而增长)将使一次插入的成本与要插入的元素总数成线性关系。由于随着表的大小调整大小变得越来越昂贵,因此必须“越来越少地”进行调整才能保持插入的摊余成本不变。

大多数实现允许平均存储桶占用增长到调整大小之前预先固定的界限(0.5 到 3 之间的任何位置,这些都是可接受的值)。根据此约定,在调整大小后,平均存储桶占用量将变为该范围的一半。通过加倍调整大小可将平均存储桶占用率保持在宽度 *2 的范围内。

小注:由于统计聚类,如果您希望多个存储桶最多有一个元素(查找的最大速度,忽略缓存大小的复杂影响),则必须将平均存储桶占用率低至 0.5,或者高达3 如果您想要最少数量的空桶(对应于浪费的空间)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么哈希表扩展通常通过将大小加倍来完成? 的相关文章

  • 找到不(必要)与二进制矩阵中的图像边界对齐的最大矩形

    我在用这个解决方案 https stackoverflow com questions 2478447 find largest rectangle containing only zeros in an nn binary matrix在
  • 寻找下一个素数的最佳方法(Java)

    我被要求编写一个程序以最佳方式找到下一个素数 我编写了这段代码 但找不到最佳答案 有什么建议么 public static int nextPrime int input input now find if the number is pr
  • 从列表中获取数组而不进行堆分配

    我有一个列表 我想将其数组分配给一个属性 public void BuildMesh List
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • 给定一个点向量(可能无序),找到多边形(不是凸包)

    我目前有一个点向量 vector
  • 对矩阵进行舍入,保留行和列总计

    想要 以保留行和列总计的方式对矩阵进行舍入的 伪 代码 问题从向量开始 X and Y of 非负整数 with Sum X Sum Y 想要圆X Y Sum X 同时保留行和列总计 这是婚姻问题的一种 Xa需要进行一定次数的握手 拨打该号
  • 如何添加到 Ruby 中的现有哈希

    关于添加一个key gt value与 Ruby 中现有的填充哈希配对 我正在学习 Apress 的 Beginning Ruby 并且刚刚完成了哈希章节 我试图找到最简单的方法来使用哈希实现与数组相同的结果 x 1 2 3 4 x lt
  • 使用您正在散列的内容的散列作为盐?

    假设用户注册了您的网站 您对他们选择的密码进行哈希处理 然后使用该哈希值作为盐 并使用该盐重新哈希其密码 Example String hash1 MD5 password String endHash MD5 hash1 password
  • 如何在没有 __hash__ 的情况下删除对象列表中的重复项

    我有一个自定义对象列表 我想从中删除重复项 通常 您可以通过定义两者来做到这一点 eq and hash 为你的对象 然后采取set的对象列表 我已经定义了 eq 但我想不出一个好的实现方法 hash 这样它对于相等的对象返回相同的值 更具
  • 修订:算法和数据结构

    我需要通过修订来构建和处理数据的想法 例如 我有一个对象数据库 例如汽车 每个对象都有许多属性 这些属性可以是任意的 因此没有一个固定的模式来描述这些对象 这些对象可能保存为键值对 现在我需要更改对象的属性 我不想完全重写它 我希望能够返回
  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 转换位域结构的字节顺序

    我需要将位字段结构从小端架构转换为大端架构 最好的方法是什么 因为如果我只是交换结构元素 字节边界就会出现问题 前结构是 struct unsigned int b1 1 unsigned int b2 8 unsigned int b3
  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树

随机推荐

  • Objective-C 类中的 Swift 协议

    I wrote SearcherProtocol在 Swift 中并且需要实现一个 Objective C 类FileSearcher必须使用这个协议 所以我尝试了这个 import
  • C++ 警告:“指针参数“arr”可以是指向 const 的指针”

    我有下面三个函数 我不确定为什么第二个和第三个函数在 arr 处有警告 但第一个函数没有 该警告是什么意思以及如何解决这个问题 IDE 克利翁2017 3 MinGW64 5 0 CMake 3 9 4 谢谢 int getFirstEve
  • Python:psycopg2.ProgrammingError:INSERT 的表达式多于目标列

    我是 python 新手 我似乎不明白为什么会出现这个错误 它告诉我参数太多 但表有 8 列 我向 它传递了 8 个参数 到底是怎么回事 这个错误是否会产生误导 真正的问题是我试图传递的值可能是None或者可以是类型Boolean usin
  • Swift 反射功能 - 如何获取实例变量名称?

    给定一个构造函数 例如 required init pTableName String pRecordKey String pStartAtRecord Int parameters append ChildElement identifi
  • 隐藏Referer(PHP、HTML、JS 无关紧要)

    我正在使用这样的东西 mysite com out php url outurl com 我只是使用一个简单的重定向 但我只是想知道如何隐藏引荐来源网址 Thanks 编辑 我最终进行了两次元刷新 引荐来源网址是由用户的浏览器附加的 而不是
  • 在应用程序购买 SKPaymentQueue finishTransaction 不起作用

    我正在 iOS sdk 中工作应用程序内购买项目 我已经准备好了应用程序内购买类 用于从应用程序商店购买应用程序 并启用项目的内部内容 但是 我的问题是 SKPaymentQueue 没有完成我的类的工作 这是我的应用程序内购买的代码班级
  • Spring Data中的多态查询

    我有一个基本抽象类 Entity Table name P FLD Inheritance strategy InheritanceType JOINED DiscriminatorColumn name FLD DISCRIMINATOR
  • 当应用程序被销毁时 PreferenceActivity 保存首选项

    我有一个 MainActivity 和一个从该 Activity 调用的 PreferenceActivity 我还运行了一个服务来查询这些首选项 当我打印这些值时 我明白了 D pref scrobble 4083 true D pref
  • Git 挂钩,通过提交进行接收后循环

    在服务器端使用 git hooks 是否可以在每次有人推送到远程存储库时循环从客户端发送到服务器的新提交消息 我需要从每条消息中提取信息 哈希 日期 提交作者 分支 我找不到任何关于 git hooks 的好的文档来解决这个问题 我已读完g
  • 保存和读取登录到钥匙串不工作 IOS swift

    Hello I have a log in view that uses face recognition to authenticate the user and If the user is authenticated it reads
  • 矢量图块缓冲区

    我在使用 Geoserver 提供的矢量切片设置 Openlayers 地图时遇到问题 线条沿着瓷砖的边缘拧在一起 看起来线条是先被剪裁 然后再设计样式 而不是相反 这使得宽线看起来很难看 更改 LOL 客户端中的渲染缓冲区不会产生任何影响
  • pandas dataframe groupby:仅正数的总和/计数

    我有一个数据框 框架 我想按国家和日期进行聚合 aggregated pd DataFrame frame groupby Country Date CaseID count aggregated Total duration frame
  • Git 子模块跟踪提交但知道分支?

    我正在一个项目中工作 我们使用 git 子模块来跟踪整个代码 一起发布的几个不同部分 所以我喜欢子模块跟踪特定提交的想法 因为子模块主要用于历史目的 这很好 这样将来人们就可以检查超级存储库的特定标签并找出每个组件的代码所在的位置 但是 如
  • 消息队列与任务队列的区别

    我想知道它们之间有什么区别 他们描述的是同一件事吗 是 Google App Engine 服务任务队列 https developers google com appengine docs java taskqueue overview是
  • 无法在 Excel for Mac 2016 中加载 macOS 连接器/MySQL ODBC 驱动程序

    我正在 High Sierra 10 13 6 上使用 Excel for Mac 版本 16 18 安装了适用于 macOS 的 Connector ODBC 8 0 12 使用 iODBC 数据源管理 64 位 测试了与我的数据库的连接
  • Xcode:添加项目作为构建依赖项

    我正在玩声音云API https github com soundcloud cocoa api wrapper tree oauth2 在其说明中说 将 SoundCloudAPI xcodeproj 拖到您的项目中 将其添加为构建依赖项
  • django(rest_framework)中的令牌身份验证不起作用

    标题基本概括了所有内容 我正在尝试使用令牌进行身份验证 我正在从 django 数据库获取信息到我的 flutter 应用程序 我已成功从rest framework 检索我的令牌并将其添加到其余请求的标头中 我在 django 中打印了这
  • ApiController 扩展方法 - 无法访问 ResponseMessage

    我想为 ApiController 创建扩展方法以便能够返回自定义内容 我的想法是用我自己的详细信息返回自定义错误 我想返回类似于返回的错误的自定义错误OAuthAuthorizationServerProvider error inval
  • ggplot:一种颜色/类别的多条线

    我正在尝试将多条线绘制为 ggplot2 中单个 类 的一部分 我可以绘制如下所示的内容 但我的问题是我想将 n1 n2 和 n3 显示为单个类 图例中每个类都有一个名称的灰色细线 我的问题是 如果我在数据框中创建一个新因素以便对它们进行分
  • 为什么哈希表扩展通常通过将大小加倍来完成?

    我对哈希表做了一些研究 并且我一直遵循经验法则 即当存在一定数量的条目 最大数量或通过负载因子 例如 75 时 应该扩展哈希表 几乎总是建议将哈希表的大小加倍 或加倍加 1 即 2n 1 然而 我一直没能找到一个很好的理由 为什么要加倍大小