堆插入的 O(1) 平均情况复杂度的论证

2023-11-23

索赔要求二进制堆的维基百科页面插入是 O(logn)在最坏的情况下,但平均 O(1):

所需的操作数量仅取决于新元素必须上升到满足堆性质的层数,因此插入操作的最坏情况时间复杂度为 O(logn),但平均情况复杂度为 O(1)。

The 链接页面试图证明这一点如下:

然而,平均而言,新插入的元素不会在树上移动很远。特别是,假设密钥均匀分布,它有一半的机会大于其父级;考虑到它比其父母大,它有二分之一的机会比其祖父母大;鉴于它大于其父母,它有一半的机会大于其曾祖父母,依此类推[...],因此在平均情况下插入需要恒定的时间

但这肯定是无稽之谈吧?在我看来,如果树是随机排序的,那么新元素有 50/50 的机会大于其父元素;但粗略地说,由于大元素沉入底部,随着堆的增长,这种可能性远小于 50/50。

是对的吗?

几个月来维基百科上都是这样……


对于平均堆插入时间为 O(1) 的说法有一个更好的参考:1991 年的论文“重复插入建堆的平均案例分析”由 Hayward 和 McDiarmid 撰写。(本文链接在当前维基百科文章的参考文献 4 中。)该论文又引用了 Porter 和 Simon 于 1975 年发表的论文,“随机插入优先级队列结构”它处理对堆的单次插入,并证明平均情况是 O(1)。

直观上,这个论点很简单。堆的一半是叶子,而且叶子往往更大。如果我们暂时假设叶子是堆中最大的元素(而不是趋向于变得更大),那么我们可以说新元素是叶子的概率 - 即它位于上半部分值的范围——正好是 0.5。如果新元素不是堆的叶子(概率也是 0.5),我们可以用原始堆中仅由非叶子节点组成的截断堆重复该过程,因此新元素位于第二个的概率 -最低水平将是剩余水平的一半:0.25。因此,它处于第三级的概率为 0.125,依此类推。那么我们需要搜索的预期级别数将是 1*0.5 + 2*0.25 + 3*0.125...,即 2。

当然,随机新元素大于随机二级父元素的概率实际上并不是 0.5;实际上是少了一点。但是,只要它受常数限制,计算幂级数的总和expected比较次数仍受常数限制。事实证明,该常数约为 2.6。

另请参阅这个有用的答案在讨论堆的复杂性并将其与 BST 进行对比的同时,给出了堆中恒定平均插入时间的详细图形分析。

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

堆插入的 O(1) 平均情况复杂度的论证 的相关文章

  • 数独算法,暴力破解[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • Java 2d 游戏中的路径查找?

    本质上它是我正在开发的一款吃豆人克隆游戏 我有一个 Enemy 类 并创建了该类的 4 个实例 它们都代表游戏的 4 个幽灵 所有幽灵都会在屏幕的随机区域启动 然后它们必须朝着吃豆人角色前进 当玩家控制吃豆人并移动它时 他们应该跟随它并尽可
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • 为什么 Dijkstra 算法使用减密钥?

    Dijkstra 教给我的算法如下 while pqueue is not empty distance node pqueue delete min if node has been visited continue else mark
  • 颜色变换器功能上的堆栈溢出错误

    我有两种颜色 红色 和 鲑鱼色 我需要动态创建面板以及面板背景颜色 这些颜色必须介于两种颜色之间 红色 public Color x y protected void Page Load object sender EventArgs e
  • Java 中旅行商问题的暴力算法

    我正在学校的数学课上做一个项目 我选择做旅行商问题 这是我一直想进行更多研究的问题 但是 我的暴力求解算法遇到了问题 请前往底部更新查看最新版本代码 如果您知道旅行推销员问题是什么 请跳过本段 尽可能概括地说 TSP 是这样的 您是一名推销
  • 如何使用 vb.net 将数据插入 Access 表?

    我想在 Access 数据库中插入一个新行 我正在考虑做类似的事情 oConnection new Connection connectionstring oTable oCennection table Orders oRow oTabl
  • 用于在链表中查找结点的生产代码

    我在一次采访中被问到这个问题 我被要求编写代码 用于在 O 1 空间和线性时间的生产环境中在链表 其形式为 Y 形式 双臂不一定相等 中查找结点 我想出了这个解决方案 我以前在某处见过 1 Measure lengths of both l
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • 如何以最低的价格优化购物车?

    我有一个我想买的物品清单 这些商品由不同的商店提供 价格也不同 商店有单独的送货费用 我正在寻找一种最佳的购物策略 以及支持它的java库 以最低的总价购买所有商品 Example 商品 1 在 Shop1 的售价为 100 美元 在 Sh
  • 最小化代表性整数的误差之和

    Given n integers between 0 10000 as D1 D2 Dn where there may be duplicates and n can be huge I want to find k distinct r
  • 确定一组日期的事件重复模式

    我正在寻找一种模式 算法或库 它将采用一组日期并在退出时返回重复的描述 即集合 11 01 2010 11 08 2010 11 15 2010 11 22 2010 11 29 2010 会产生类似 十一月的每个星期一 的结果 有没有人以

随机推荐

  • 如何检查Python中的字符串中是否有*任一*字符? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我知道 if a in cat win 但有没有更好的方法来查找是否either字符串中存在两个字母 以下是一些方法 if a in cat or d in cat win if
  • 如何将逗号分隔的数字字符串转换为整数数组?

    说我有绳子1 2 3 4 5我想将其转换为整数数组 最好的方法是什么 我知道我可以使用爆炸来创建一个带有字符串的数组 但我需要数组项是整数 您可以使用array map申请intval分解字符串后的每个数组项 string 1 2 3 4
  • 使用 scrapy 蜘蛛间歇性“getrandom() 初始化失败”

    我构建了一个 scrapy 蜘蛛 scrapy 1 4 该蜘蛛是通过 django rq 和supervisord 从 django 网站按需触发的 这是正在监听 django rq 事件的supervisord 作业 reddit 用作代
  • 检索 ASP.NET 中的所有发布值

    我正在创建一个 ASP NET 应用程序 它允许用户将表单元素添加到表单内的页面 当页面发布时 通过提交按钮 我需要循环遍历表单中所有发布的值并获取值 我无法检查具体值 因为我不知道会有多少个值或它们将被称为什么 有人可以指出我获取所有发布
  • 如何将数据集拆分/分区为训练和测试数据集,例如交叉验证?

    将 NumPy 数组随机拆分为训练和测试 验证数据集的好方法是什么 类似的东西cvpartition or crossvalindMatlab 中的函数 如果你想将数据集分成两部分 你可以使用numpy random shuffle or
  • 当需要相同类型的多个实例时,使用 Unity 进行 DI

    我需要这方面的帮助 我使用 Unity 作为容器 并且想将同一类型的两个不同实例注入到我的构造函数中 class Example Example IQueue receiveQueue IQueue sendQueue IQueue 是在我
  • OrderedDict 在 Python 3.7 中会变得多余吗?

    来自Python 3 7 变更日志 插入顺序保存性质dict物体已宣布成为 Python 语言规范的正式部分 这是否意味着OrderedDict会变得多余吗 我能想到的唯一用途是保持与旧版本 Python 的向后兼容性 旧版本的 Pytho
  • Boost::Asio,SSL 连接问题

    我已经尝试解决我的问题几天了 但就是无法解决 我尝试使用 Boost Asio 库和 OpenSSL 进行 SSL 连接 有一个示例代码 如何做到这一点 http www boost org doc libs 1 55 0 doc html
  • 如何使用selenium获取特定元素的html源?

    我正在查看的页面包含 div p text 1 p h1 text 2 h1 text 3 p text 4 p div 我想获取 div 中的所有文本 除了
  • 阿特金分段筛可能吗?

    我知道可以实现埃拉托斯特尼筛法 以便它连续找到素数而没有上限 分段筛 我的问题是 阿特金 伯恩斯坦筛法可以用同样的方式实现吗 相关问题 C 如何使阿特金筛增量 然而相关问题只有1个答案 即 对于所有筛子都是不可能的 这显然是不正确的 Atk
  • 文件 InfoPlist.strings 无法打开

    谁能帮帮我吗 我应该如何修复错误 无法打开文件 InfoPlist strings 因为没有这样的文件 它是在我从 SVN 更新我的项目后出现的 实际上我的项目中有 InfoPlist strings 我不知道为什么 Xcode 没有看到它
  • 写入现有 Excel 文件

    package jexcel jxl nimit import java awt Label import java io File import java io IOException import jxl Cell import jxl
  • 删除数据表中的主键

    有没有办法从数据表中删除主键或者有没有办法先删除 PK 的约束 然后删除列本身 Thanks UPDATED dtTable Columns Add new System Data DataColumn PRIMARY KEY typeof
  • 通过伪经典实例化掌握原型继承(JavaScript)

    我正在尝试通过 JavaScript 使用继承来通过测试套件 下面是我到目前为止的代码片段 var Infant function this age 0 this color pink this food milk Infant proto
  • 将双精度型转换为 int

    转换的最佳方法是什么double to an int 应该使用演员阵容吗 如果您想要默认的向零截断行为 则可以使用强制转换 或者 您可能想使用Math Ceiling Math Round Math Floor等等 尽管之后你仍然需要演员阵
  • 将字符串转换为日期时间(使用 SSIS)

    我想将值 5 27 2013 16 42 37 490000 从平面文件 DT STR 读取 插入到 SQL Server 表的列 日期时间 中 如果我尝试在派生列中使用 DT DBDATE 或 DT DBTIMESTAMP 对其进行强制转
  • 忽略 Xcode4 中的“属性不可用”警告

    我在工具栏项中使用了很多 自定义标识符 这在 Xcode4 中很好 但在构建项目时它给了我一堆警告 属性不可用 Interface Builder 3 2 之前版本中的自定义标识符 有没有办法在Xcode4中忽略这些警告 当我搜索 真正的
  • Chart.js 中饼图的点击事件

    我有一个关于 Chart js 的问题 我使用提供的文档绘制了多个饼图 我想知道单击其中一个图表的某个切片是否可以根据该切片的值进行 ajax 调用 例如 如果这是我的data var data value 300 color F7464A
  • 学习MFC编程的先决条件[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我懂一点 C 和 C 我现在正在处理的项目是大量的 MFC 编程 有经验的人可以告诉我学习MFC的前提条件吗 另外 什么是最好的学习来源 有什么特别
  • 堆插入的 O(1) 平均情况复杂度的论证

    索赔要求二进制堆的维基百科页面插入是 O logn 在最坏的情况下 但平均 O 1 所需的操作数量仅取决于新元素必须上升到满足堆性质的层数 因此插入操作的最坏情况时间复杂度为 O logn 但平均情况复杂度为 O 1 The 链接页面试图证