2014-02-21 80 views
1

我正試圖在給定數組中連續的相似位合併。例如:在數組中連續位合併

輸入:

a=[0 0 0 1 1 1 0 0 1 0]; 

輸出:

b=[0 1 0 1 0]; 

我輸入數組大小超過10萬,所以很明顯我沒有通過我的整個輸入數組要循環。有沒有更簡單的方法?也許是遞歸分裂和規則算法? 僅供參考,我正在MATLAB中運行此操作,因此任何使用矩陣運算的方法都會很棒

+0

它可以在'O(n)'時間完成,是的 - 但是懷疑它可以在'O(log n)'中完成:你需要查找相鄰的元素。 –

+0

亞..我希望是否有任何標準算法。 – BaluRaman

+0

我認爲你想要的單詞是「連續的」,而不是「連續的」。而且,不,如果不考慮一般情況下的每一點,你都無法做到。如果你知道模式中有一些順序,你可以跳過檢查一些位,但你仍然可能看看n/x字節,其中x是一些(可能很小)的常數。 –

回答

1

對於循環遍歷整個數組(至少在最壞的情況下),你無法做得更好。

這個解決方案當然是微不足道的 - 您只需循環遍歷 - 如果當前元素與最後一個元素不同,則將其添加到輸出中。


你可以做不是簡單地一點點增加的複雜性循環通過更好。

考慮一下,當我們發生了什麼:

...0x1... or ...1x0... 

哪裏x要麼是01。不管什麼x是,輸出將仍然是相同的。

那麼,我們可以做的是檢查每一個第二個元素。如果該元素與元素2的位置不同,我們可以簡單地將其添加到輸出並繼續。如果相同,我們需要檢查前一個元素(如果前一個元素不同,則將前一個元素和當前元素添加到輸出中,如果相同,則繼續前進)。


請注意,循環100000個元素不會花費太長的時間。

+0

+1。通過查找表和少量添加的邏輯,您甚至可以逐字節而不是逐位執行。但最多隻能提供8倍的加速(由於增加了複雜性,更可能是4倍速)。儘管如此,還是O(n)。 –

1

對於所提供的例子,這會工作:

a(abs(diff(a)) ~= 1) = [] 
a = 

    0  1  0  1  0 

雖然,不知道如何推廣到的a其他例子。

1

以下是類似於@馬辛的答案,但它的索引倖存的項目,而不是刪除重複的條目:

a = a([true logical(diff(a))]); 

在我的電腦它是關於快兩倍,爲長度100000

的矢量