我想找到未排序列表中的近似中值,我知道两个算法
算法1-快速选择
算法2-中位数中位数
我不能在我的项目中使用quickselect,因为在最坏的情况下需要O(n ^ 2)。
我听说过中位数的中位数,但我的同事们认为O(n)需要一些常数因子。因此,它的时间复杂度是Cn,与快速选择相比,常数因子很大。我想知道与中位数中位数有关的常数因素是什么?为什么中位数的中位数不使用9个元素的伪中位数?
或者是他们的任何其他算法来找到线性时间O(n)的近似中值?
答案 0 :(得分:0)
虽然我不会很快放弃快速选择,但由于选择合适的枢轴,它的最坏情况表现很不可能......
也许是introselect:
Introselect(“内省选择”的缩写)是一种选择算法,它是快速选择和中位数中位数的混合,具有快速的平均性能和最佳的最坏情况表现。
Introselect的工作方式是乐观地开始使用quickselect,并且只有在没有取得足够进展的情况下多次递归时才切换到最差时间线性算法。切换策略是算法的主要技术内容。简单地将递归限制为恒定深度是不够的,因为这将使算法切换所有足够大的列表。 Musser讨论了几种简单的方法:
- 跟踪到目前为止处理的子分区的大小列表。如果在任何时候进行了k个递归调用而没有将列表大小减半,对于一些小的正k,则切换到最坏情况的线性算法。
- 汇总到目前为止生成的所有分区的大小。如果这超过列表大小乘以一些小的正常数k,则切换到最坏情况的线性算法。这个总和很容易在单个标量变量中跟踪。
两种方法都将递归深度限制为k⌈logn⌉= O(log n),将总运行时间限制为O(n)。