C 什么是比较算法的好方法?
我在读一篇文章,通过首先分析两种算法来比较它们 我的老师教我,你可以直接使用算法的步骤数来分析算法 例如:C 什么是比较算法的好方法?,c,algorithm,analysis,C,Algorithm,Analysis,我在读一篇文章,通过首先分析两种算法来比较它们 我的老师教我,你可以直接使用算法的步骤数来分析算法 例如: algo printArray(arr[n]){ for(int i=0;i<n;i++){ write arr[i]; } } 当M=N时,将具有O(MXN)~O(N^2)的复杂性。for中的语句执行MXN次 类似地O(logn)。如果它将输入分成两个相等的部分。等等 但根据那篇文章: 度量执行时间,语句数不利于分析算法 因为: 执行时间将取决于系统,并且
algo printArray(arr[n]){
for(int i=0;i<n;i++){
write arr[i];
}
}
当M=N
时,将具有O(MXN)
~O(N^2)
的复杂性。for
中的语句执行MXN
次
类似地O(logn)
。如果它将输入分成两个相等的部分。等等
但根据那篇文章:
度量执行时间
,语句数
不利于分析算法
因为:
执行时间将取决于系统,并且
语句的数量将随所使用的编程语言而变化
它说
理想的解决方案是将算法的运行时间表示为输入大小的函数N
,即f(N)
<>这让我有点困惑,如果你认为执行时间不是很好的措施,你怎么计算运行时间?< /P>
这里的专家能详细说明一下吗
提前感谢。执行时间确实取决于系统,但也取决于算法执行的指令数
此外,我不明白步骤的数量是如何无关的,因为算法被分析为语言不可知的,并且没有注意到各种语言所暗示的任何特征和语法糖分
自从我开始分析算法以来,我一直遇到的算法分析的一个度量是执行指令的数量,我看不出这个度量是如何无关的
同时,复杂度类被认为是一个“数量级”,表示算法的速度或速度。它们取决于执行指令的数量,并且独立于算法运行的系统,因为根据定义,基本操作(如两个数字的相加)应该花费恒定的时间,不管这个“常数”在实践中意味着多大或多小,因此复杂性类不会改变。精确复杂度函数表达式中的常数可能因系统而异,但与算法比较实际相关的是复杂度类,因为只有通过比较这些常数,才能发现算法在越来越大的输入(渐近)上的行为与另一种算法相比。执行时间确实取决于系统,但也取决于算法执行的指令数
此外,我不明白步骤的数量是如何无关的,因为算法被分析为语言不可知的,并且没有注意到各种语言所暗示的任何特征和语法糖分
自从我开始分析算法以来,我一直遇到的算法分析的一个度量是执行指令的数量,我看不出这个度量是如何无关的
同时,复杂度类被认为是一个“数量级”,表示算法的速度或速度。它们取决于执行指令的数量,并且独立于算法运行的系统,因为根据定义,基本操作(如两个数字的相加)应该花费恒定的时间,不管这个“常数”在实践中意味着多大或多小,因此复杂性类不会改变。精确复杂度函数表达式中的常数可能因系统而异,但与算法比较实际相关的是复杂度类,因为只有通过比较这些常数,才能发现算法在越来越大的输入(渐近)上的行为与另一种算法相比。Big-O表示法将常数(固定成本和常数乘数)挥霍掉。因此,任何需要kn+c
操作才能完成的函数(根据定义!)O(n)
,无论k
和c
。这就是为什么最好使用真实数据对算法进行真实测量(分析),以了解它们的有效速度
但是,执行时间显然会因数据集的不同而有所不同——如果您试图提出一个不基于特定使用场景的通用性能度量,那么执行时间就没有那么重要了(除非你在相同的条件下比较所有算法,即使这样,也不一定公平,除非你对大多数可能的场景建模,而不仅仅是一个场景)
当你移动到更大的数据集时,Big-O表示法变得更有价值。它让你大致了解算法的性能,假设k
和c
的值合理。如果你有一百万个数字要排序,那么可以说你想远离任何O(n^2)
算法,并尝试找到一个更好的O(n lg n)
算法。如果你对三个数字进行排序,理论上的复杂度界限就不再重要了,因为常数支配着所占用的资源
还要注意的是,虽然一个给定的算法可以用不同的编程语言表达的语句数量差别很大,但需要执行的恒定时间步数(在目标体系结构的机器级别,通常情况下,整数算术和内存访问需要固定的时间,或者更准确地说,需要固定的时间)这是一个由big-O衡量的算法所需的固定成本步骤的最大数量的界限,它与给定输入的实际运行时间没有直接关系,但仍然大致描述了随着数据集大小的增长,给定数据集必须完成的工作量。big-O表示法将常数挥霍掉(
algo printMatrix(arr,m,n){
for(i=0;i<m;i++){
for(j=0;j<n;j++){
write arr[i][j];
}
}
}