我对时间复杂度在对称矩阵上进行迭代感到好奇。
我知道对于标准矩阵(二维数组),复杂度为O(Nˆ2)。但是,对于对称矩阵,我们仅对遍历其上三角部分而不是对其所有元素进行遍历。
这是迭代对称矩阵的常用算法:
for(int i=0; i < symmetricM.length; i++)
for(int j=i; j < symmetricM.length; j++ )
System.out.println("Elem: "+symmetricM[i][j]);
如果可能的话,我想对任何对称的多维数组扩展相同的推理。
我无法自行计算,但是由于这种方法解决了许多问题,因此我希望在复杂性方面感到满意。
谢谢。
答案 0 :(得分:2)
让我们看一下我们在对称二维数组中迭代的元素数量,由于大小为n^2/2
并且有n
个维度,所以它是2
,因此我们提高了幂取2并除以2仅得到元素的一半。 O(n^2)
。
现在,让我们看一下在对称3维数组中迭代的元素数量。是n^3/6
。您可以得出结论,以同样的方式计算volume of a 3 dimensional triangle,因为所有数字均位于此三角形区域。即使我们除以3,时间复杂度仍为O(n^3)
。
对于4维,它将是n^4/(4*3*2)
,即O(n^4)
。但是对于m
维,它将是n^m/m!
,并且由于该维是参数,因此根据此方法,时间复杂度将为O(n^m/m!)
。
另一种计算方法是,如果删除该尺寸的对角线,则在没有重复元素且所有元素都不相同的情况下,要迭代的项的索引与组合相同。我们知道该组合的数量为n!/m!(n-m)!
或n choose m
,所以这也可能是时间复杂度。
根据大多数factorial approximations,最大元素是n^n
,因此当使用这些近似值并忽略较小的因素时,时间复杂度保持不变,因为:
n!/m!(n-m)! ≈ n^n/m!(n-m)^(n-m) > n^n/m!n^(n-m) = n^m/m!
。
因此最终时间复杂度将为O(n^m/m!)
。