哈希表真的可以是 O(1) 吗?

2024-03-13

哈希表可以实现 O(1) 似乎是常识,但这对我来说从来没有意义。有人可以解释一下吗?我想到了以下两种情况:

A. 该值是一个小于哈希表大小的 int。因此,该值是它自己的哈希值,因此不存在哈希表。但即使有,也会是 O(1) 并且效率仍然很低。

B. 您必须计算该值的哈希值。在这种情况下,所查找数据的大小的顺序是 O(n)。在完成 O(n) 工作后,查找可能是 O(1),但在我看来仍然是 O(n)。

除非您有完美的哈希或大型哈希表,否则每个桶可能有多个项目。因此,无论如何,它在某个时刻都会演变为小型线性搜索。

我认为哈希表很棒,但我没有得到 O(1) 指定,除非它只是理论上的。

维基百科的哈希表的文章 http://en.wikipedia.org/wiki/Hash_table始终引用恒定的查找时间并完全忽略哈希函数的成本。这真的是一个公平的措施吗?


Edit:总结一下我学到的东西:

  • 从技术上讲这是正确的,因为散列函数不需要使用密钥中的所有信息,因此可以是恒定时间,并且因为足够大的表可以将冲突降低到接近恒定时间。

  • 在实践中确实如此,因为随着时间的推移,只要选择哈希函数和表大小以最小化冲突,它就会起作用,即使这通常意味着不使用恒定时间哈希函数。


这里有两个变量,m 和 n,其中 m 是输入的长度,n 是哈希中的项目数。

O(1) 查找性能声明至少做出两个假设:

  • 您的对象可以在 O(1) 时间内比较相等。
  • 哈希冲突很少。

如果您的对象大小可变,并且相等性检查需要查看所有位,那么性能将变为 O(m)。然而,哈希函数不必是 O(m) - 它可以是 O(1)。与加密哈希不同,字典中使用的哈希函数不必查看输入中的每一位来计算哈希。实现可以自由地仅查看固定数量的位。

对于足够多的项目,项目的数量将变得大于可能的散列数量,然后您将遇到冲突,导致性能上升到 O(1) 以上,例如,对于简单的链表遍历,O(n)(或 O(n *m) 如果两个假设都是假的)。

在实践中,尽管 O(1) 声明在技术上是错误的,但大约对于许多现实世界的情况都是如此,特别是上述假设成立的情况。

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

哈希表真的可以是 O(1) 吗? 的相关文章

  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 优化 CSS 交付 - Google 的建议

    谷歌建议在 head 中使用非常重要的 CSS 内联 并在内部使用其他 CSS
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 为什么 System.nanoTime() 比 System.currentTimeMillis() 慢(性能)?

    今天我做了一个快速基准测试来测试速度性能System nanoTime and System currentTimeMillis long startTime System nanoTime for int i 0 i lt 1000000
  • 将数据从一个线程传递到另一个线程的最快可能方法

    我正在使用增强spsc queue将我的东西从一个线程移动到另一个线程 这是我的软件中的关键位置之一 所以我想尽快完成它 我写了这个测试程序 include
  • 为什么对于小数组,for-of 循​​环比标准 for 循环快,而对于大数组则慢?

    在 JavaScript 中 我注意到 ES6for of循环的性能与传统的有很大不同for start stop step loop 基准 const n 10000 const arr Array n fill map e i gt i
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • jQuery - 提高处理 XML 时的选择器性能

    我正在处理一个 XML 文件 当使用 XPath 样式选择器选择节点时 该文件的性能非常慢 这是运行特别慢的部分代码 for i 0 i
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 哈希表的空间复杂度是多少?

    具有 32 位键和指向单独存储的值的 32 位指针的哈希表的大小是多少 是 2 32 个槽 4 字节 键 4 字节 指向值的指针 4 10 9 4 4 32GB 我想了解哈希表的空间复杂度 我认为你问错了问题 数据结构的空间复杂度表示它占用
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • JavaFX 中 WebView 的性能

    我有一个 HTML5 UI 和一个 Java 后端 并且希望避免在纯 java 中重建 HTML ui 所以我的想法是运行本地 Web 服务器并使用 WebView 在 本机 窗口中呈现它 解决方案似乎是使用可以嵌入到 swing 中的 J
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx

随机推荐

  • CData部分未完成问题

    当我对下面的 XML 使用 DOMDocument loadXML 时 出现错误 Warning DOMDocument loadXML domdocument loadxml CData section not finished http
  • 在 Chrome 中的密码字段上使用 setCustomValidity 时出现不可读的文本

    如果我在 html5 表单密码字段上使用 setCustomValidity 设置错误消息 它会像密码字段本身一样弹出为气泡或星星 从而导致不可读的消息 这是一个 jsfiddle 来演示我的意思 http jsfiddle net Lcf
  • 在序言中返回列表

    我想问一个关于返回列表的问题 事实 团队 团队名称 总监 国籍 总体目标 team milan allegri italy 8 5 team inter benitez italy 7 6 team barcelona guardiola
  • 在WHMCS中将专用IP显示到viewinvoice.tpl和invoicepdf.tpl中?

    您好 堆栈我有一个问题不知道如何解决 我想显示客户订单中的专用 IP 如下所示 我做了一个简短的检查 发现需要完成查看发票 tpl and 发票pdf tpl文件 我发现专用IP被存储到tbl主机数据库中的表 我找到了这段代码 php cl
  • 在C#中修改XML现有内容

    目的 我计划使用 XmlTextWriter 创建一个 XML 文件 并使用 XmlNode SelectSingleNode node ChildNode InnerText someting 等修改 更新一些现有内容 我使用 XmlTe
  • 如何将 autodie 与非内置函数一起使用?

    autodie 文档暗示 除了默认情况下可以处理的内置函数之外 还可以将它用于其他功能 但没有明确的示例如何在其中执行此操作 具体来说 我想将它用于成像器模块 其中的很多函数和方法都可能会失败 如果这不意味着我的代码会到处都是 我更愿意or
  • 在 PHP 中按多维数组分组并用逗号连接结果(不会创建不必要的逗号)

    我需要将二维数组中的行按两列分组 然后在每个组中 我需要用逗号连接另一列的值 请注意 在第三行中 诊断值为空 data id gt 1 begin gt 01 01 diagnostic gt a id gt 1 begin gt 01 0
  • 使用 getScript 加载 jQuery UI

    我正在尝试构建一个需要人员加载 jQuery 和 jQuery UI 的小部件 加载 jQuery 不是问题 但在标题中添加 ui 却不起作用 而且我不断收到此错误 b is undefined Break on this error fu
  • 集合被修改,枚举操作可能无法执行

    我有多线程应用程序 但收到此错误 Exception Text System InvalidOperationException Collection was modified enumeration operation may not e
  • Bash 将文件移动到同名文件夹[重复]

    这个问题在这里已经有答案了 如果我将其发布在错误的位置 我提前道歉 我对脚本编写非常陌生 更不用说 stackoverflow 了 我有许多以以下结尾的文件 conf与多个同名文件夹 不带后缀 位于同一目录中 conf扩大 例如 我的目录如
  • Codesign 返回未知错误 -1=ffffffffffffffff

    我尝试对 iOS 应用程序进行代码签名 这些是我遵循的步骤 security create keychain p password KEYCHAIN security set keychain settings u t 300 KEYCHA
  • 图像在幻灯片上旋转

    我正在使用引导轮播插件来幻灯片显示照片 问题是有些图像旋转了 90 度 有什么办法可以解决这个问题吗 这是 HTML div class container div class row div class col md 8 col md o
  • 如何检查任何类型的变量是否是数组

    我尝试将 swift 协议数组转换为任何数组 但失败了 protocol SomeProtocol class class SomeClass NSObject SomeProtocol let protocolArray SomeProt
  • 如何为“插入”表单中的字段传递默认值?

    如何为 插入 表单中的字段传递默认值 我正在使用 Meteor 的软件包 Autoform Collections2 和 Simple Schema 我的流程是 用户在页面列表中选择某个值 然后 打开 插入 我希望使用用户在上一步中选择的值
  • 如何用c++语言中的tensorflow.so和c_api.h加载图?

    我找不到任何有关如何加载图表的示例tensorflow so and c api h在C 中 我读了c api h 但是 那ReadBinaryProto功能不在其中 如何在没有ReadBinaryProto功能 如果您使用 C 您可能需要
  • 为派生类专门化 std::hash 在 gcc 中有效,而不是 clang

    我正在努力专攻std hash对于派生类 迄今为止最好的方法是基于这个答案 https stackoverflow com a 31213703 620382 include
  • scala ArrayBuffer 删除带有谓词的所有元素

    Scala 在过滤不可变序列方面非常优雅 var l List 1 2 3 4 5 6 l l filter 2 1 但是如何使用像 ArrayBuffer 这样的可变集合来做到这一点呢 我发现的只是删除单个元素或切片 或者从另一个序列中删
  • 如何在弹出菜单中使用单选按钮?

    我正在尝试创建一个包含可选单选按钮的弹出菜单 以便更改视图类型 例如图库 卡片 滑动 网格 列表等 我遇到的问题是 PopupMenu 有自己的用于选择值的回调 Radio 和 RadioListTile 也是如此 忽略RadioListT
  • 自动将调试器附加到 Eclipse 中的新 Java 子进程

    我有一个 Java 进程 它使用 ProcessBuilder 等生成一个新的 JVM 在调试时 是否可以让 Eclipse 将调试器附加到新的子进程 更好的是 是否有任何插件在注意到新的子进程时会自动执行此操作 我被告知 虽然还没见过 V
  • 哈希表真的可以是 O(1) 吗?

    哈希表可以实现 O 1 似乎是常识 但这对我来说从来没有意义 有人可以解释一下吗 我想到了以下两种情况 A 该值是一个小于哈希表大小的 int 因此 该值是它自己的哈希值 因此不存在哈希表 但即使有 也会是 O 1 并且效率仍然很低 B 您