有哪些算法讓妳大吃壹驚?
給壹個長度未知的流式數據,要求流式結束後返回n個數據,而且是等概率的。聽到這個問題我很震驚。如果已知流的長度為L,當然,對於每個數據,我可以生成壹個N/L的概率。但是長度未知,也就是概率未知。如何判斷這個數據來的時候是否保留,保證等概率...我很疑惑。經過壹番研究,發現了這種算法。算法的簡單程度令人驚嘆:首先保留前N個數據,以N/i的概率選取後續數據,其中I為當前數據序號,如果保留,則從原始N個數據中隨機排除壹個。最後可以返回這個n,這也很容易證明,而且奇妙的是在計算概率的時候,有壹個很長的分數是可以上下連續遞減的。相互舍入後剩下的概率正好是N/L,L是總長度。簡直太精彩了!顯然,這種算法也是非常有用的,因為在實際問題中,會有很多情況需要在流數據中進行采樣,為接下來的數據處理做準備。而且這個居然還有壹個O(L)的算法,太神奇了!