[英]Is there an algorithm for finding log(n) order statistics in linear time
我可以建立一個算法FindStats(A,k)
它接收大小為n和整數k的輸入數組A,使得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)。
我可以改善嗎? 甚至有可能達到目標嗎?
我認為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
這意味着,如果在每個選擇之后(或期間)將列表划分為一半大小的部分,並確保下一個選擇的輸入,則傳遞給選擇算法的總輸入量永遠不會超過O(n)
。 我們的時間計算如下:
find 2^kth: n
find 1/2 * 2^kth: 2^k
find 1/4 * 2^kth: 2^(k-1)
find 1/8 * 2^kth: 2^(k-2)
...
The sum on the right cannot exceed
n + 2^(k + 1)
=> O(n + 2^(log2(n) + 1))
=> O(n)
(If it takes an extra traversal to
partition the list after each selection,
the summation could add another n,
not affecting the general complexity.)
使我感興趣的另一個想法是,我們是否可以以某種方式使用堆化方法來確保所有表親都比下一個表親小。 有效地執行此操作還可以使用廣度優先搜索來遍歷此特殊堆的每個級別,從而確保O(n)解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.