算法的时间复杂度分析有两种方式。
一种方式是计算算法具体的执行时间,最终根据这个时间的长短评价算法的优劣。这种估计方法比较简单易
于操作,但是这种方法有一个缺点:估计时间会随着计算机的不同而产生变化(不同计算机的配置、同一个
计算机所处环境不同都会影响)。
另一种方式是只记录算法的关键操作。
例如这个程序:
--------------------------------------------
for (int a = 0; a < num1; a++)
{
for (int b = 0; b < num2; b++)
{
num[a][b] = b;
}
}
--------------------------------------------
其代码段中出现了循环语句的嵌套。应该使用乘法法则,所以O(T(n))=O(num1*num2)。
循环语句的循环条件会对我们计算算法时间复杂度产生一定的迷惑作用。很多初学者认为循环次数越少的
算法在时间开销方面越小。从原理上说这是对的但不要忘记,大O表示法只是算法在时间开销方面的数量
级,若数量级相同,即使两个算法执行关键操作的步数实际上并不相同,那么也把它们看做是时间复杂度
相等的两个算法。
举例下面的程序:
--------------------------------------------
for (int a = 0; a < num1/2; a++)
{
for (int b = 0; b < num2/2; b++)
{
num[a][b] = b;
}
}
---------------------------------------------
这段代码与前面的例子在结构上一模一样,唯一不同之处在于两重循环的次数减少为原来的一半。用公式
计算这段代码的时间复杂度可知O(T(n))=O(num1*num2/4),显然num1*num2与num1*num2/4具有相同的数量级
两者均为n的平方,所以这段代码与上面的代码具有相同的时间复杂度。
例:
---------------------------------------------
Node* Find(const Type& X, Node* ptr)
{
if (ptr == NULL)
{
return NULL;
}
else
if (X < ptr->data)
return Find(X, ptr->leftChild);
else
if (X > ptr->data)
return Find(X, ptr->rightChild);
else
return ptr;
}
--------------------------------------------
上述代码定义了函数Find。但在实现部分函数又调用了Find自身。
像这种自身定义自身的情况就叫做递归。
函数Find的作用是在指针ptr指向的链表中寻找变量X,并返回指向X所在结点的指针。这里链表中的数是有
序存放的,现假定它为从小到大的顺序。Find的执行过程是:首先令X与链表中间的数值进行比较,若相等
,返回结点指针;若小于,则在中间结点左侧的链表中寻找变量X,寻找方式与上面相同;若大于,则在中
间结点的右侧链表中寻找变量X,寻找方式与上面相同。如此递归下去直到算法结束为止。(折半查找法)
这是一种常用的查找法。
若链表的长度为n,则平均查找的时间为log以2为底n的对数,所以算法的时间复杂度为O(log@2n)。
通常程序的时间复杂度有(按照从小到大的顺序排列):c, log@2n, n, nlog@2n, n^2, n^3, 2^n,
3^n, n!。(@表示以2为底,n^2表示n的2次方)
若c表示常数,即算法的执行时间是固定不变的,不随程序中其他变量状态的改变而发生变化。但要注意,
语句a=1;与语句a=(a+b)*c+(d+e)*f+g/h;的时间复杂度同为c。不可认为后面的赋值语句较长就认为它有更
高的时间复杂度。
分享到:
相关推荐
关于算法时间复杂度的计算 关于算法时间复杂度的计算 关于算法时间复杂度的计算
算法 时间复杂度 空间复杂度 经典算法 时间复杂度 空间复杂度 经典算法 时间复杂度 空间复杂度 经典
算法时间复杂度
算法时间复杂度分析基础算法时间复杂度分析基础算法时间复杂度分析基础
排序算法时间复杂度的研究 期刊网站可是要现金的哦。
关于递归算法时间复杂度分析的探讨.pdf
算法时间复杂度分析中递归方程求解方法综述
对若干个数据进行操作,实现快速排序、选择排序、直接插入排序、堆排序算法时间复杂度的比较;并在排序数据中快速查找某一数据,给出查找是否成功,以及数据所在的位置信息。
根号n段归并排序算法时间复杂度分析过程: 1.合并 根号n向下取整 段子数组使用的是自底向上两两归并的策略 2.根号n段归并排序算法时间复杂度的数学推导
大学二年级课程 算法设计与分析的一般算法时间复杂度的证明过程,希望可以帮到大家.
以堆排序算法为例,改变输入规模n,测试算法时间复杂度
多段图算法时间复杂度图像
所有算法时间复杂度对比、图表形式、函数关系
选择排序、冒泡排序、归并排序、快速排序、插入排序的算法原理。不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。
这是数据结构算法课程中算复杂度的作业及答案。
广度优先搜索构建迷宫(BFS算法)动态构建过程的python 源代码,详情请移步本人博客<迷宫与寻路可视化(二)广度优先搜索构建迷宫(BFS算法)>
1. 首先产生要进行排序的整形数组(可以保存在文件中...2. 调用各种排序方法对数组排序,并记录花费时间 对于更多更高级的排序算法,以后会实现,另外,对于复杂字符串排序,这些简单排序并不适合,请采用更高效的方法
试完成求有向图的强连同分量的算法,并分析算法的时间复杂度
常见算法的时间复杂度计算方法. 定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。
均值滤波很常见 但一般的算法复杂度都和取值窗口w*h有关 算法复杂度太高 本算法优化了基础的均值滤波算法 算法复杂度大大降低