Python 将矩阵变换为零矩阵;自定义转换规则
您将获得一个Python 将矩阵变换为零矩阵;自定义转换规则,python,algorithm,matlab,math,matrix,Python,Algorithm,Matlab,Math,Matrix,您将获得一个8x8自然数表。(比如说,考虑魔法矩阵)。在任何一个步骤中,您可以将任何一行中的每个数字加倍,或者从任何一列中的每个数字中减去1。设计 将原始表转换为全零表的算法 我试着使用下面描述的算法,但这需要很长时间。即使对于3x3矩阵,运算次数也为10^49。 任何使用此算法的人,计算机,8x8矩阵算法的时间复杂度是多少? 我在下面引用我的代码;有没有人有更高效的算法 dim = 3; m=magic(dim) for i=1:dim c=0; while(length(fi
8x8
自然数表。(比如说,考虑魔法矩阵)。在任何一个步骤中,您可以将任何一行中的每个数字加倍
,或者从任何一列中的每个数字中减去1。设计
将原始表转换为全零表的算法
我试着使用下面描述的算法,但这需要很长时间。即使对于3x3矩阵,运算次数也为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
有一种解决方案如下,但我认为可以改进:
不要考虑其他栏目,每一步都只关注一个栏目。
通过以下步骤,尝试将此列中的每个项目更改为2,将此列转换为零:
- 考虑列中最低的非零非2项为
m
- 将此列减去
m-1
次
- 在上面的步骤中,行的任何项都变成了列的1倍和2倍
- 重复这三个步骤,直到完成所有2列
现在用1减去步骤2中的列,两次
对所有8列重复步骤1至3
如果表的最大值为M,则此算法顺序为O(M)。因为表中有恒定的64项
我希望我的算法是清楚的,但如果有什么你不明白的,请问
编辑:为了更好地理解这一点,我只对您找到的一个简单矩阵执行以下步骤。您尝试的暴力方式是什么?可能是您没有得到它,因为此问题对于任何输入都无法解决,例如M=one(8,8);M(1)=2代码>。也许可以开始编写一个问题生成器,生成可解决的实例。从一个零矩阵开始,并暗示反向步骤,然后你得到一个可解矩阵,你就知道了答案。@Daniel你的例子是错误的,Prateek提到的自然数是从1开始的。这个问题总是有答案的,只要看看我下面的算法:)记住这些算法很可能会出现整数溢出。@Daniel:M=one(8,8);M(1)=2代码>将是可解的:将除第一行以外的所有行乘以2,从第1列进行两次减法运算,将第一行乘以2,从除第1列以外的所有行进行两次减法运算。您的意思是,在第2步(iii)中,“在上述步骤中,列的任何项变为1,将其行乘以2”?我不清楚第2步(iii)和(iv)@Prateek查看此链接,这将解决您的问题:)@Prateek您看到我的编辑了吗?你还有什么问题吗?是的,我看到了编辑。我检查了它的工作原理,但它只是变得非常大!我的电脑,甚至不能完成它,即使是一个3x3魔术矩阵。将前两列自身归零时,数字的顺序为10^48。就在那时,一切还没有结束。你能告诉我你所说的算法的顺序是O(M)是什么意思吗?@Prateek真的吗?那么大?我原以为会很大,但没那么大!你是不是有多余的?或者时间复杂性是你的问题?