您将获得<{>>自然数的8x8
表格。 (考虑一下魔术矩阵,让我们说)。在任何一个步骤中,您都可以 double each of the numbers in any row
或 subtract 1 from each of the numbers in any one column
。设计
transforms the original table into a table of all zeros
的算法。
我尝试使用下面描述的算法,但它只需要很长时间。即使对于3×3矩阵,操作的数量也是10 ^ 49的量级。 任何人都可以使用这种算法,计算机对于8x8矩阵算法的时间复杂度是多少? 我在下面引用我的代码;有没有人有更好的效率算法,
dim = 3;
m=magic(dim)
for i=1:dim
c=0;
while(length(find(m(:,i)==2))~=length(m(:,i)))
c = c + 1;
if length(find(m(:,i)==1))>0
for j=find(m(:,i)==1)
m(j,:)=m(j,:)*2;
end
end
% m
if (i==2)
m
end
if (length(find(m(:,i)==2))~=length(m(:,i)))
k = min(m(find(m(:,i)>=2),i));
l = length(find(m(:,i)==2));
m(:,i)=m(:,i)-(k-1);
end
% m
if (i==2)
m
end
% if(i==3 && mod(c,100)==0)
% c
% end
end
i
m(:,i)=m(:,i)-2
end
m
答案 0 :(得分:1)
有一个解决方案如下,但我认为可以改进:
不要考虑其他专栏,每一步都只关注一列。
通过以下步骤将此列转换为零,并尝试将此列中的每个项目更改为2:
m
。m-1
次。现在从步骤2中减去两次,一次减去1.
对所有8列重复步骤1到3。
如果表的最大值为M,则此算法顺序为O(M)。因为表有64个项目。
我希望我的算法很清楚,但是如果有任何你不理解的事情,请问。
编辑,为了更好地理解这一点,我只需针对您找到here的简单矩阵执行此步骤。