Har*_*man 5 algorithm big-o selection median-of-medians
除了中位数算法算法之外,还有其他方法可以在最坏情况下的O(n)时间进行k选择吗?实施中位数中位数是否有意义; 我的意思是,性能优势是否足够实用?
tem*_*def 12
还有另一种基于软堆数据结构计算k阶统计量的算法,该算法是标准优先级队列的一种变体,允许"破坏"它存储的一些优先级.该算法在维基百科文章中有更详细的描述,但基本思想是使用软堆有效地(O(n)时间)为分区函数选择一个支点,保证良好的分割.从某种意义上说,这只是中位数算法的修改版本,它使用(可以说)更直接的方法来选择枢轴元素.
软堆并不是特别直观,但本文中提供了很好的描述("Chazelle软堆的更简单的实现和分析"),其中包括对数据结构的正式描述和分析.
但是,如果您想要一个非常快速,最坏情况的O(n)算法,请考虑使用introselect.这个算法实际上非常精彩.它首先使用quickselect算法,该算法非智能地选择一个数据透镜并使用它来对数据进行分区.这在实践中非常快,但具有糟糕的最坏情况行为.Introselect通过跟踪跟踪其进度的内部计数器来解决此问题.如果算法看起来要降级到O(n 2)时间,它会切换算法并使用像中位数中值这样的东西来确保最坏情况下的保证.具体来说,它会监视在每一步中丢弃多少数组,如果在丢弃输入的一半之前发生了一些常数步骤,算法会切换到中位数算法,以确保下一个数据集好之前然后使用quickselect重新启动.这保证了最坏情况下的O(n)时间.
这种算法的优点是它在大多数输入上都非常快(因为快速选择非常快),但具有很大的最坏情况行为.该算法的描述以及相关的排序算法内省可以在本文中找到("内省排序和选择算法").
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4265 次 |
| 最近记录: |