更改数组中的位

时间:2017-08-10 08:20:57

标签: java algorithm

我有一个位数组。比特将根据以下标准关闭和打开: 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;
}

1 个答案:

答案 0 :(得分:1)

有些事情要看:

  • 如果你的最后一个p第一位或第p位是0,它们将始终保持为0,因此将位p + 1(分别为p-1)。所以你可以添加一个检查,减少你的l循环的开始/结束(并将p + 1数字改为0)
  • Similaraly,如果p first(resp last)数字为1,则p-1数字将保持为1而bit位数为0
  • 我全部为零或全部为1,不再需要更改
  • 同样的事情可以在你的阵列中间完成(中间5个零?下次会有7个。五个1?三个中间会保持1个),但不确定它很容易整合(只有你说1000相同的位才值得处理它我认为)
  • 如果你没有结束所有0或全部1,你将有一个0和1的替代。所以你也可以检查你是否交替0和1,并且在剩余的m上有一个模2,你可以预测结果

编辑:在我的示例中,p> = 2,当然是极端

编辑:您可以将数组表示为int数组中相似位的数量+记忆第一位 log_df <- mutate_all(x,function(x){x==min(x)}) # identify rows that contain min (no time wasted sorting here) filter1 <- rowSums(log_df)>0 # to get rid of uninteresting rows x2 <- x[filter1,] log_df2 <- log_df[filter1,] gathered <- gather(log_df2,var,val) # put in long format rows_to_keep <- which(gathered$val) cbind(x2[(rows_to_keep-1) %% nrow(x2) + 1,],gathered[rows_to_keep,]) %>% select(-val) 将表示为[0] 3412221111(从零开始,然后是3,然后是4,然后是1,然后是2,等等)

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

例如,步骤将是:

000111101100110101