我正試圖在給定數組中連續的相似位合併。例如:在數組中連續位合併
輸入:
a=[0 0 0 1 1 1 0 0 1 0];
輸出:
b=[0 1 0 1 0];
我輸入數組大小超過10萬,所以很明顯我沒有通過我的整個輸入數組要循環。有沒有更簡單的方法?也許是遞歸分裂和規則算法? 僅供參考,我正在MATLAB中運行此操作,因此任何使用矩陣運算的方法都會很棒
我正試圖在給定數組中連續的相似位合併。例如:在數組中連續位合併
輸入:
a=[0 0 0 1 1 1 0 0 1 0];
輸出:
b=[0 1 0 1 0];
我輸入數組大小超過10萬,所以很明顯我沒有通過我的整個輸入數組要循環。有沒有更簡單的方法?也許是遞歸分裂和規則算法? 僅供參考,我正在MATLAB中運行此操作,因此任何使用矩陣運算的方法都會很棒
對於循環遍歷整個數組(至少在最壞的情況下),你無法做得更好。
這個解決方案當然是微不足道的 - 您只需循環遍歷 - 如果當前元素與最後一個元素不同,則將其添加到輸出中。
你可以做不是簡單地一點點增加的複雜性循環通過略更好。
考慮一下,當我們發生了什麼:
...0x1... or ...1x0...
哪裏x
要麼是0
或1
。不管什麼x
是,輸出將仍然是相同的。
那麼,我們可以做的是檢查每一個第二個元素。如果該元素與元素2的位置不同,我們可以簡單地將其添加到輸出並繼續。如果相同,我們需要檢查前一個元素(如果前一個元素不同,則將前一個元素和當前元素添加到輸出中,如果相同,則繼續前進)。
請注意,循環100000個元素不會花費太長的時間。
+1。通過查找表和少量添加的邏輯,您甚至可以逐字節而不是逐位執行。但最多隻能提供8倍的加速(由於增加了複雜性,更可能是4倍速)。儘管如此,還是O(n)。 –
對於所提供的例子,這會工作:
a(abs(diff(a)) ~= 1) = []
a =
0 1 0 1 0
雖然,不知道如何推廣到的a
其他例子。
以下是類似於@馬辛的答案,但它的索引倖存的項目,而不是刪除重複的條目:
a = a([true logical(diff(a))]);
在我的電腦它是關於快兩倍,爲長度100000
的矢量
它可以在'O(n)'時間完成,是的 - 但是懷疑它可以在'O(log n)'中完成:你需要查找相鄰的元素。 –
亞..我希望是否有任何標準算法。 – BaluRaman
我認爲你想要的單詞是「連續的」,而不是「連續的」。而且,不,如果不考慮一般情況下的每一點,你都無法做到。如果你知道模式中有一些順序,你可以跳過檢查一些位,但你仍然可能看看n/x字節,其中x是一些(可能很小)的常數。 –