我有一个位数组。比特将根据以下标准关闭和打开: 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 :(得分:1)
有些事情要看:
编辑:在我的示例中,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