- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近阅读了 Bernard Chazelle 的论文“The Soft Heap, An Approximate Priority Queue with Optimal Error Rate by Bernard Chazelle”(http://www.link.cs.cmu.edu/15859-f07/papers/chazelle-soft-heap.pdf)
该报大量谈论“腐败”。什么是腐败,元素是如何被腐 eclipse 的,它对你有什么帮助?
我花了很多时间阅读论文和谷歌搜索,但这仍然没有意义。
最佳答案
在大多数关于优先级队列的研究论文中,队列中的每个元素都有一个相关的编号,称为优先级,该编号在插入元素时设置。然后元素按优先级递增的顺序出列。现在大多数支持优先级队列的编程语言实际上并不使用显式优先级,而是依靠比较函数来对元素进行排序,但软堆使用“关联数字优先级”模型。
由于优先级队列按优先级递增的顺序将元素出列,因此它们可用于对值序列进行排序 - 首先将优先级等于其在序列中的排名的每个元素插入优先级队列,然后将所有元素从优先级队列中出队.这将按排序顺序拉出元素。
不过,优先级队列和排序之间的这种连接是有代价的。比较排序算法有已知的下限(没有比较排序算法的运行时间可以优于 O(n log n))。因此,任何基于比较的优先级队列的运行时间都有一个下限。具体来说,n 个入队和 n 个出队的总成本必须不高于 O(n log n)。大多数情况下,这很好,但在某些情况下,这还不够快。
只要可以使用优先级队列对输入序列进行排序,n 个入队和 n 个出队的运行时间永远不会超过 O(n log n)。但是如果优先级队列不对输入进行排序呢?将其发挥到极致——如果优先级队列以完全任意的顺序交回元素,那么就有可能在 O(n) 时间内实现 n 个入队和 n 个出队——例如,只需使用堆栈或队列。
直观地说,您可以将软堆视为“始终排序”和“对顺序没有任何保证”这两个极端之间的桥梁。每个排序堆都在某个称为“损坏参数”的量 ε 上进行参数化,该参数决定了从软堆中出来的值与排序的接近程度。具体来说,随着 ε 越接近 0,输出将逐渐变得更加有序,而随着 ε 越接近 1,输出将逐渐变得更加随意。适本地,软堆操作的运行时间被确定为 O(log ε-1) 的函数,因此操作的运行时间随着 ε 的增加而变得越来越便宜(因此,输出变得更少排序)并且随着 ε 下降,操作变得更加昂贵(在这种情况下,输出变得越来越排序)。
软堆使用新的“损坏”概念精确量化输出的未排序程度。在普通的优先级队列中,一旦插入元素/优先级对,元素的优先级就永远不会改变。在软堆中,当元素位于软堆内时,与优先级关联的元素可能会损坏。当一个元素的优先级被破坏时,它的优先级会上升一些。 (由于软堆按优先级递增的顺序将元素出列,元素的优先级递增意味着它将比正常情况更晚从队列中出来)。换句话说,损坏将导致元素不按排序顺序出现,因为元素出列时的优先级不一定与入队时相同。
ε 的选择会调整多少不同元素的优先级会被破坏。 ε 小,优先级损坏的元素越少,ε 大时,优先级损坏的元素越多。
现在,对于你的具体问题——元素的优先级是如何被破坏的,这对你有什么帮助?你的第一个问题很好 - 数据结构如何决定何时破坏优先级?有两种查看方式。首先,您可以将软堆视为一种数据结构,您可以在其中预先指定可接受的损坏程度(即 ε 参数),然后数据结构在内部决定何时以及如何损坏优先级,只要它不超过某个总腐败水平。如果让数据结构做出这样的决定看起来很奇怪,请考虑使用布隆过滤器或跳过列表之类的东西,其中确实存在内部随机选择,可以影响数据结构的可观察行为。事实证明,软堆通常不是使用随机性实现的(这是一个令人印象深刻的特性!),但这在这里并不是特别相关。
在内部,软堆的两个已知实现(一个来自 Chazelle 的原始论文,后来使用二叉树进行清理)使用称为拼车的技术实现损坏,其中元素组合在一起并共享一个共同的优先级。损坏的发生是因为每个组中所有元素的原始优先级都被忘记了,而是使用了新的优先级。元素如何分组的实际细节非常复杂,并不值得研究,因此最好将其保留为“数据结构选择随心所欲地破坏,只要它不破坏更多元素比您在选择 ε 时指定的要多。”
接下来,为什么这很有用?在实践中,事实并非如此。软堆几乎完全具有理论意义。理论上它很好的原因是软堆中 n 次插入和 n 次删除的运行时间可以是 O(n) - 比 O(n log n) 快 - 如果 ε 选择正确。最初,软堆被用作构建最小生成树的快速算法中的构建块。它们还用于线性时间选择的新算法,这是自著名的中值中值算法以来第一个在线性时间中运行的此类确定性算法。在这两种情况下,软堆都用于对输入元素进行“近似”排序,使算法可以粗略地近似排序序列,此时算法会执行一些额外的逻辑来纠正缺少的完美。您几乎肯定不会在实践中看到使用软堆,但是如果您最终找到了一个案例,请发表评论并告诉我!
总结一下:
关于data-structures - 软堆 : what is corruption and why is it useful?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26126170/
我正试图找到一个基准来衡量用户愿意等待远程服务响应的时间。在我的例子中,响应是非常有用的,但不是对数据输入的业务关键验证。我想 HCI 领域一定已经在这方面做了一些工作。 如果您知道软实时响应的普遍接
这个问题在这里已经有了答案: What's the difference between SoftReference and WeakReference in Java? (12 个回答) 关闭6年前
社区维基 我不在乎声誉点,我只想要好的答案。请随意将此问题标记为社区 wiki。 上下文 我一直在研究《理性策划者》,并发现了以下观察结果: 逻辑编程非常有趣。 逻辑编程有时是违反直觉的 逻辑编程通常
我已阅读this article关于Java中不同类型的引用(强引用、软引用、弱引用、幻像引用),但我不太理解。 这些引用类型之间有什么区别?每种类型何时使用? 最佳答案 Java 提供了两种不同类型
我需要一个带有弱键或软键的并发 HashMap ,其中等式是 equals 而不是 ==。 对于此类键,Google Collection 默认选择 ==。 有没有办法覆盖这个选择?我应该如何进行?
我读了here使用下面的命令我们可以在 Linux 系统上模拟硬重启: echo 1 > /proc/sys/kernel/sysrq echo b > /proc/sysrq-trigger 但我想
我正在使用软件 I²C实现读取一组 Sensirion SHT21 传感器。我正在尝试找出一种让传感器回答以查看它们是否实际连接到设备的方法。我正在使用 Arduino,这意味着我所有的代码都是 C/
这个问题在这里已经有了答案: How do you determine using stat() whether a file is a symbolic link? (1 个回答) 关闭 9 年前
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我一直在使用 ICS 上的 Wifi Direct API,但有点卡住了。 在 API 中,有一个名为 createGroup 的方法可以在手机上创建一个基于遗留软件的接入点。这很棒并且有效,但我似乎
当我在 ruby 中有一个数组时,我可以在其上运行 delete_if block 。问题是它从我的数组中删除了元素。我想要相同的功能,只是不对原始数组进行更改,而是返回一个删除了对象的新数组。
在 Ubuntu Virtualbox 上运行从 Windows 移植的音频应用程序时,它报告以下内容: Devices found: OpenAL Soft OpenAL Soft 40964 in
下面是我的数据库结构的简化版本(在 MVC 2 中构建一个概念验证站点,使用 Entity Framework 4 作为我的 ORM): [Stores] StoreID (PK) StoreName
我用 ESP8266 创建了一个软 AP,我通过 android 6.0 marshmallow mobile 连接到它。连接后,如果我忽略它并打开浏览器窗口打开我的网络服务器页面或使用自定义构建的应
如何应用 Three.js online editor 中所示的 PCF (SOFT) 阴影类型以 JavaScript 代码的形式发送到你的渲染器? 最佳答案 要使用该类型的阴影,您需要使用相应类型
我知道 Wifi Direct 的工作原理是在其中一台设备中创建软 AP(软件接入点)。我也知道很多 Android 支持 Wifi Direct,但 iPhone 不支持。 我的问题是:是否可以创建
我有一个在 14.04.05 LTS 上运行的 Ubuntu 服务器。 此服务器上还安装了几个 ugins mongodb 应用程序。 MongoDB版本为3.4.2 我正在尝试增加 mongodb
我是一名优秀的程序员,十分优秀!