2017-08-10 33 views
3

我有一个位数组。位将根据以下标准切换和打开: 1.如果位左侧和右侧的位打开,则该位为1,否则为零。 2.边界条件(最左边和最右边的位将只用以下标准依赖于一个比特。即,或者左的它或它的右边。更改数组中的位

此阵列将被处理m次。

我写的下面的代码中,A是原始数组,subsiquent是处理数组,但是这会给我O(nm),其中n是长度,m是我想要执行该过程的次数。这样我就可以减少我的复杂性了。

for(int k = 0;k < m;k++){ 
    for(int l = 0;l < n;k++){ 
    if(l == 0){ 
     if(A[l+1]==1) 
     subsiquent[l]=1; 
     else 
     subsiquent[l]=0; 
     //** is there a } missing here? 
     else if(l==n){ 
     if(A[l-1]==1) 
      subsiquent[l]=1; 
     else 
      subsiquent[l]=0;       
     } else { 
     if(A[l+1]==1 && A[l-1]==1){ 
      subsiquent[l]=1; 
     }else{ 
      subsiquent[l]=0; 
     } 
     } 
    //** or is there a } missing here?  
    } 

    A = subsiquent; 
} 
+0

要扫描'N'位'M'次?我怀疑O(n * m)以下的复杂度可能会显着降低。 – Thomas

+0

所以你建议没有其他解决方案可以切换。除了扫描m次之外,不能做任何事情来进行切换吗?谢谢 –

+0

@ketananand你为什么要扫描m次? –

回答

1

有些事情要看:

  • 如果你最后一个第一个或最后一个比特是0,它们将始终保持为0,所以比特p + 1(resp。 p-1)。所以你可以添加一个检查,并减少你的循环的开始/结束(并将p + 1数字更改为0)
  • 同样,如果p first(resp last)数字是1,那么p-1数字将停留在1和位p将为0
  • 我已经全部为零或全部为1,不需要更改需要
  • 同样的事情可以在你的数组中间完成(中间是5个零?下一次是7,五个1?三个中间将保持1),但不确定它很容易整合(只有当你说1000个相同位是值得处理它我认为)
  • 如果你没有结束对所有0或全1,你将有一个0和1的交替。所以你也可以检查你是否交替0和1,并用模2重新maining米,可以预测结果

编辑:具有p>在我为当然四肢例子= 2

编辑:可以表示在一个int数组的数组作为相似的比特数+记住第一位 000111101100110101将表示为[0] 3412221111(从零开始,然后是3零,然后是4,然后是1,然后是2,等等)

我没有检查全部,但你可以用最小的步骤轻松地推断出一步到另一步的规则。 (有很多情况下,我让你找到它们,你只需要从左到右,记住你从0和1切换,但是迭代或者插入数字时可能需要修改/减少右边的数字。链表将在这里非常适合)

例如,步骤是:

000111101100110101 [0]3-4-1-2-2-2-1-1-1-1  
000011010000001010 [0]4-2-1-1-6-1-1-1-1 
000000100000000101 [0]6-1-8-1-1-1 
000000000000000010 [0]16-1-1 
000000000000000001 [0]17-1 
000000000000000000 [0]18 
+0

感谢您的帮助 –