Time 分析矩阵的嵌套for循环的时间复杂性

Time 分析矩阵的嵌套for循环的时间复杂性,time,for-loop,matrix,nested,complexity-theory,Time,For Loop,Matrix,Nested,Complexity Theory,假设我有一个矩阵,它有X行和Y列。元素的总数是X*Y,对吗?这就是n=X*Y吗 for (i=0; i<X; i++) { for (j=0; j<Y; j++) { print(matrix[i][j]); } } for(i=0;i如果有一个大小为rows*columns的矩阵,那么内部循环(比方说)是O(columns),嵌套循环一起是O(rows*columns) 你把问题大小N与问题大小N^2混淆了。你可以说你的矩阵是大小N或者你的矩阵是大小

假设我有一个矩阵,它有X行和Y列。元素的总数是X*Y,对吗?这就是n=X*Y吗

for (i=0; i<X; i++)
{
   for (j=0; j<Y; j++)
   {
      print(matrix[i][j]);
   }
}

for(i=0;i如果有一个大小为rows*columns的矩阵,那么内部循环(比方说)是O(columns),嵌套循环一起是O(rows*columns)


你把问题大小N与问题大小N^2混淆了。你可以说你的矩阵是大小N或者你的矩阵是大小N^2,但是除非你的矩阵是正方形,否则你应该说你有一个大小为行*列的矩阵。

你说的
N=X X Y
是对的,但你说的嵌套循环应该是
O(N)是错的
。如果您干运行代码,就可以理解嵌套循环的含义。您会注意到,对于外部循环的每次迭代,内部循环都会运行
n
(或者大小条件)次。因此,通过简单的数学运算,您可以推断出它的
O(n^2)
。但是,如果在迭代
(X X Y)
(例如:
for(i=0;i)时只有一个循环
一般来说,我认为所有嵌套的for循环都是O(n^2)

你错了。我想让你困惑的是,人们经常用平方(X==Y)矩阵作为例子,所以复杂性是n*n(X==n,Y==n)


如果你想练习你的O(*)技能,试着弄清楚为什么矩阵乘法是O(n^3)。如果你不知道矩阵乘法的算法,很容易在网上找到它。

这个答案写得很仓促,得到了一些反对票,所以我决定澄清并重写它

算法的时间复杂度是根据算法要解决的问题的大小来表示算法的运算次数

这里涉及两种尺寸

  • 第一个大小是矩阵X×Y的元素数,这对应于复杂性理论中已知的输入大小。让k=X×Y表示矩阵中的元素数。由于双循环中的运算数是X×Y,因此它是O(k)

  • 第二个大小是矩阵的列数和行数。设m=max(X,Y)。双循环中的运算数为O(m^2)。通常在线性代数中,这种大小用于表征m×m矩阵上矩阵运算的复杂性

  • 当你谈论复杂度时,你必须精确地指定你如何编码一个实例问题,以及你使用什么参数来指定它的大小。在复杂度理论中,我们通常假设一个算法的输入是一个来自某个有限字母表的字符串,并用上限来衡量算法的复杂度由长度为n的字符串给出的问题实例上的操作数的界。在复杂性理论中,n通常是输入的大小

    在算法的实际复杂度分析中,我们通常使用在特定上下文中更有意义的实例大小的其他度量。例如,如果
    A
    是图的连通矩阵,我们可以使用顶点数
    V
    作为问题实例复杂度的度量,或者如果
    A
    是图的连通矩阵作用于向量空间的线性算子的矩阵,我们可以使用向量空间的维数作为度量。对于平方矩阵,惯例是用矩阵的维数来指定复杂性,即用n来度量作用于n×n矩阵的算法的复杂性。这通常是有实际意义的,并且lso符合特定应用领域的约定,即使它可能与复杂性理论的约定相矛盾

    让我们给我们的双循环命名为矩阵扫描。你可以合理地说,如果矩阵扫描实例的大小是矩阵字符串编码的长度。假设条目的大小有界,它是矩阵中元素的数量k。那么我们可以说矩阵扫描的复杂度为O(k)另一方面,如果我们将m=max(X,Y)作为表征实例复杂性的参数,这在许多应用中是惯常的,那么X×Y矩阵的复杂性矩阵扫描也将是O(m^2)。对于平方矩阵X=Y=m和O(k)=O(m^2)


    注意:评论中的一些人问我们是否总能找到问题的编码,从而将任何多项式问题简化为线性问题。这是不正确的。对于某些算法,运算数量的增长速度快于输入字符串编码的长度。例如,没有乘法算法两个操作数为θ(m^2)的m×m矩阵。这里输入的大小随着m^2的增长而增长,但是证明了操作数的增长至少与m^2 log m一样快。如果n在O(m^2)中,那么m^2 log m在O(n log n)中,最著名的算法复杂性随着O(m^(2+c))=O(n^(1+c/2)而增长,其中,对于Coppersmith Winograd算法的版本,c至少为0.372,对于普通的迭代算法,c=1。

    你如何推导O(m^2)=O(n)
    ?这显然是错误的!它的工作原理是否像我们将每个多项式问题放到线性空间:)你说:
    一般来说,让m=max(X,Y)然后O(m^2)=O(n)
    。不管你怎么说,这都是大错特错的。但是
    O(X*Y)=O(n^2)
    是完全有效的,你不需要
    n=max(X,Y)
    ,因为它是大的,不是大的θ符号,而且是隐含的。你现在的答案是,你声称“嵌套循环是O(n)”,如果你写一篇论文并证明它,你就可以获得诺贝尔奖:)为了向OP和其他人澄清,
    O(X*Y)
    O(n^2)
    ,因为X和Y是变量。
    O(X*Y)
    只有当X或Y是常数时才是
    O(n)
    ,因为它不会增长。最后,
    O(X*Y)
    可以是
    O(1)
    只有当X和Y是常数时,t