- 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/
这是我第一次在结构中使用结构。我在编译我的程序时遇到了这个错误。错误:字段“结果”的类型不完整。 错误是指这行代码。-->结构result_t结果; 有什么帮助吗? :)谢谢。 typedef str
typedef struct mensagem { int sender ; int receiver ; char *text ; } *Item ; typedef str
我正在使用 ExpressionEngine 和 Structure 附加组件的最新版本。 我正在寻找有关生成 4 项导航栏的帮助,其中两项位于不同的结构级别。 我的结构行如下所示: 服务(父) --
我正在处理一个非常大的数据集。本质上,我将处理数百万条记录并将值存储到数据集中。 每次我存储一个值时,我必须首先检查以确保该值不在数据结构中。如果值在数据结构中,我必须更新(或删除/添加)记录以更新计
我正在尝试分别使用视频帧和音频来分析视频,我想出了一个看起来像这样的模型 现在,我将训练数据分成两个生成器 - 一个用于视频,一个用于音频。我必须进一步将生成器分成两半,我认为这是我遇到错误的地方。因
我有一个创建 N 个进程的程序,每个进程创建 M 个线程。 我还有一个结构需要传递给线程函数。 当我像这样创建 M 个线程时: thread_args_t** thread_arg = malloc(
我正在试图弄清楚如何实现一个等待事件发出信号的函数。指针由DLL函数返回,该函数是存储3个项的结构。其中两个是句柄,它们只是指针,最后是一些随机的未使用的指针。我真的不确定这应该如何格式化,因为我两个
根据PLCOpen、IEC-61131标准,是否可以在声明中初始化结构体? 我正在考虑类似于 this C++ question 的事情. 最佳答案 您可以在结构声明时向结构变量添加默认值。您还可以在
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
在纯 C 中工作,将结构嵌套在其他结构或指向结构的指针中更好。使用指针可以更容易地实现良好的对齐,但是访问内部结构需要额外的取消引用。只是具体地说: typedef struct {
我正在使用 Qt Creator 开发应用程序。 我不是一个好的C++程序员,所以可能会有概念上的错误等。 我在复制结构数组并返回结构时遇到问题。 有很多与类似标题相关的解决方案,但无法解决我的问题。
我正在尝试使用带水印的 dropDuplicate 函数对流数据进行重复数据删除。我目前面临的问题是我必须为给定记录设置两个时间戳 一个是事件时间戳 - 从源创建记录的时间戳。 另一个是传输时间戳 -
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 10年前关
我尝试构建一个嵌套循环,用于创建 2 维零矩阵来解决 LCS 问题(动态规划)。这后来用于计算 Rouge-L 分数(输入是张量,而不是字符串),但它总是出错引发 ValueError: The tw
我曾多次使用 HDFS 和 Kafka,我注意到 Kafka 比 HDFS 更可靠。因此,现在使用 Spark-structured-streaming 时,我很惊讶检查点仅适用于 HDFS。使用 K
C11,6.7.2.1 结构和 union 说明符,约束,3(添加了强调): A structure or union shall not contain a member with incomple
在 emacs lisp 中,各种树结构是常见的。 custom.el通过:type提供论据 defcustom定义自定义变量的预期形状的标准方法。但是有没有一种标准的方法来验证一些随机 emacs
我在网上遇到了以下面试问题。 描述一个数据结构,其中 getValue(int index)、setValue(int index, int value) 和 setAllValues(int val
我正在使用 sqldf 对一个巨大的文件进行子集化。以下命令为我提供了一个 100 行和 42 列的 data.frame。 first <- read.csv.sql("first.txt", se
来自这里的 C++ 背景。我需要为我的一门类(class)编写 C 语言,但我从未接触过这一类(class)。这两个声明之间有什么区别?为什么要包含 struct 关键字?有不同的含义吗?它们在 C+
我是一名优秀的程序员,十分优秀!