【发布时间】:2014-10-06 22:11:49
【问题描述】:
嗯,我正在阅读一篇关于通过首先分析它们来比较两种算法的文章。
我的老师教我,你可以通过直接使用算法的步数来分析算法。
例如:
algo printArray(arr[n]){
for(int i=0;i<n;i++){
write arr[i];
}
}
将具有O(N) 的复杂度,其中N 是数组的大小。它会重复 for 循环 N 次。
同时
algo printMatrix(arr,m,n){
for(i=0;i<m;i++){
for(j=0;j<n;j++){
write arr[i][j];
}
}
}
当M=N 时,复杂度为O(MXN) ~ O(N^2)。 for 中的语句被执行 MXN 次。
类似O(log N)。如果它将输入分成两等份。等等。
但是根据那篇文章:
措施Execution Time、Number of statements 不利于分析算法。
因为:
Execution Time 将依赖于系统,并且,
Number of statements会因所使用的编程语言而异。
它指出
理想解决方案将算法的运行时间表示为输入大小 N 即 f(n) 的函数。
这让我有点困惑,如果你认为执行时间不是很好的衡量标准,你如何计算运行时间?
这里的专家可以详细说明一下吗?
提前致谢。
【问题讨论】:
-
您已经在 O(N)、O(N^2) 等分析中使用“理想解决方案”。执行时间很难判断,除非您在单个平台上比较多种算法。至于行,不正确的分析是:“PrintArray 在其算法中有 2 行”和“PrintMatrix 有 3”。 O(N) 和 O(N*M) 是理想的方法。
-
算法是数学过程:它们的实现可能因语言而略有不同,但数学运算保持不变。您所指的复杂性根据它执行的操作量为您提供了运行时的近似值。选择算法有更多方面,例如它所需要的内存以及您是否想要摊销时间(而不是复杂性,这是最坏情况下的时间),但通常您描述的方法主要用于确定算法的质量。
-
您犯了一个常见的错误,即认为写入 2D 数组的每个元素都是
O(N^2)操作。它是O(N),其中N是数组中的元素数。N可能是另一个数字的平方这一事实与此类分析无关。如果您不相信这项研究,并了解到无法通过更改计数方式将算法从一种复杂性类别转换为另一种复杂性类别N。如果我们能做到这一点,我们将永远不会对二维数组使用简单的扫描,因为O(N^2)比O(N)差得多;我们只需将数组保留为 1D。 -
嗯,我只是很困惑我的老师是正确的还是那篇文章的作者或两者兼而有之?以及如何?
-
@VedantTerkar 你的老师和作者说要使用相同的方法(时间复杂度)。唯一的区别是他们使用不同的术语。