版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40567865/article/details/79852565
算法的效率
效率指的是算法执行的时间。对于同一个问题如果有多个算法可以解决,执行时间短的算法效率更高。但同一个算法用不同的语言实现,或者用不同的编译环境进行编译,或者在不同的计算机上运行时,效率均不同。这说明用绝对的时间单位衡量算法的效率是不合适的。
所以我们可以用算法中基本操作重复执行的次数来衡量一个算法的好坏
时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作
T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度。
我们来看一个程序。
void Test(int n)
{
int iCount = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
iCount++;
}
}
}
for(int l = 0;k < 2*n; ++k)
{
iCount++;
}
int count = 10;
while(count--)
{
iCount++;
}
语句总执行次数:
时间复杂度实际就是一个函数,该函数计算的是执行基本操作的次数
算法分析的分类
算法存在最好、平均和最坏情况:
- 最坏情况:任意输入规模的最大运行次数(上界)
- 平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数,通常最好情况不会出行(下界)
例如:在一个长度为N的线性表中搜索一个数据x最好情况:1次比较
- 最坏情况:N次比较
- 平均情况:N/2次比较
在实际中通常关注的是算法的最坏运行情况,即:任意输入规模N,算法的最长运行时间。理由如下:
- 一个算法的最坏情况的运行时间是在任意输入下的运行上界
- 对于某些算法,最坏的情况出现的较为频繁
- 大体上看,平均情况与最坏情况一样差
因此:一般情况下使用O渐进表示法来计算算法的时间复杂度
时间复杂度之大 O渐进表示法
一个算法语句总的执行次数是关于问题规模N的某个函数,记为f(N),N称为问题的规模。语句总的执行次数记为T(N),当N不断变化时,T(N)也在变化,算法执行次数的增长速率和f(N)的增长率相同。则有T(N)=O(f(N)),称为时间复杂度的渐进表示法。
一般算法O(n)计算方法:
- 用常数1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项
- 如果最高阶项数存在且不是1,则去除与这个项目相乘的常数