1. 程式人生 > >資料流小問題--find the missing elements

資料流小問題--find the missing elements

這是關於資料流的一個有趣的小問題。問題可以定義為:整個資料流裡的元素為1到n的排列(無序),假設移除了k個數,如何找出這k個數。要求使用盡可能少的空間。而且只能順序掃描資料一次。

對於這個問題,如果沒有空間的限制,我們可以使用bitmap輕鬆搞定,bitmap使用n位即可,掃描到每個元素i,就把第i位設為1,最後結束後值為0的那些位置序號找出來就是所求結果,空間複雜度為O(n)。這個問題時間複雜度肯定是O(n),但在空間複雜度上仍可改進。我們從k=1和k=2這特殊情況開始討論,然後給出這個問題的通用解決方法。

一、k=1

假設是1到n的排序,中移除其中一個元素構成的元素,。如何找出移除的那個元素i,也就是找出

,但是

對於這個問題,應該比較容易想出來如下方法來進行計算。我們知道中元素總和為,而中元素總和為。我們只需要統計出流中元素總和即可。這時候我們演算法中儲存的最大的數字為n*(n+1)/2,需要位來儲存,所以空間複雜度為

二、k=2

該種情況就是資料流中原本n個元素,移除了兩個元素,還剩n-2個元素。按照第一節中的思路,我們可以求出移除元素的和以及平方和,然後通過解方程來獲得最終答案。具體來說,我們首先計算:

我們在遍歷每個元素的時候,進行:

當遍歷完整個資料流後,我們可得:


通過解方程組即可得出:

我們需要儲存兩個變數。需要 ,需要,總共需要位儲存。

三、k>=3

該種情況下我們可以將k=2時的解決思路進行拓展。我們首先可以使用第二節中的方法得到移除元素的和、平方和,一直到k次方的和。


另外:


通過newton identities,可有由表示。其實就是展開後到x的係數以及常數項(的絕對值)。的解是。  

關於newton identities可參看:

http://en.wikipedia.org/wiki/Newton%27s_identities#Formulation_in_terms_of_symmetric_polynomials