資料流小問題--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