组合数组中的连续位

时间:2014-02-21 09:40:34

标签: arrays algorithm matlab sorting loops

我正在尝试在给定数组中组合连续相似的位。例如:

输入:

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

输出:

b=[0 1 0 1 0];

我的输入数组大小超过100000,所以显然我不想遍历整个输入数组。有没有更简单的方法?也许一个递归的划分和规则算法? 仅供参考,我在MATLAB中运行它,因此任何使用矩阵运算的方法都很棒

3 个答案:

答案 0 :(得分:1)

循环遍历整个阵列(至少在最坏的情况下),你做得不够好。

这个解决方案当然是微不足道的 - 你只需循环遍历 - 如果当前元素与最后一个元素不同,则将其添加到输出中。


你可以稍微做一些 ,而不仅仅是通过一些额外的复杂性来循环。

考虑一下我们遇到的情况:

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

其中x01。无论x是什么,输出仍然是相同的。

所以,我们能做的就是检查每一个元素。如果该元素与元素2的位置不同,我们可以简单地将其添加到输出并继续。如果它是相同的,我们需要检查前一个元素(如果前一个元素不同,将前一个元素和当前元素都添加到输出中,如果它们相同,则继续)。


请注意,循环100000个元素不会花费特别长的时间。

答案 1 :(得分:1)

对于提供的示例,这将起作用:

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

    0     1     0     1     0

但是,不确定它如何概括为a的其他示例。

答案 2 :(得分:1)

以下类似于@ Marcin的答案,但它会对幸存的条目编制索引,而不是删除重复的条目:

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

在我的电脑上,对于长度为100000的矢量,速度大约是其两倍。