我可以构建一个算法FindStats(A,k)
接收大小为n的输入数组A和一个整数k,使得2 ^ k <= n(这意味着k在最坏的情况下为log(n)),并输出A的1,2,4,8,。 ..,2 ^ k订单统计信息。 所有这些都是线性时间!
到目前为止我尝试过什么:
我知道有一种算法QuickSelect(A,k)(确定性算法)可以在线性时间内返回第k次统计量,但在我的情况下,这是遍历所有1,2的平凡解决方案, 4,8 ...,2 ^ k订单统计并返回O(nlogn)。
我可以改善它吗?甚至有可能实现吗?
答案 0 :(得分:0)
我认为Jim Mischel的答案采用了类似的逻辑。我不确定为什么要删除该答案。
如果我们承认有任何选择算法可以保证k
时间内的单个O(n)
阶统计量,那么也可以在1st, 2nd, 4th, 8th..., 2^kth
中找到O(n)
时间。这是由于简单的代数:
let a = 2^k
then the sequence,
a + 1/2*a + 1/4*a + 1/8*a + 1/16*a ...
converges and can never exceed 2*a
这意味着,如果在每个选择之后(或期间)将列表划分为一半大小的部分,并确保下一个选择的输入,则传递给选择算法的总输入量永远不会超过{{1} }。我们的时间计算如下:
O(n)
令我感兴趣的另一个想法是,我们是否可以以某种方式使用堆化方法来确保所有表亲都比下一个表亲小。有效地执行此操作还可以保证使用广度优先搜索遍历此特殊堆的每个级别的O(n)解决方案。