您的位置:首页 > 理论基础 > 数据结构算法

《大话数据结构》读书笔记 第二章 算法 函数的渐近增长

2013-08-09 19:14 363 查看
2.8. “函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,是的对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐近快于g(n)”

  笔记:

  1)函数的渐近增长,针对函数的“增长”这一角度来说,却又不是函数自身的特性,而是在函数之间关系的反应。

  2)函数的渐近增长,简单来说,就是“到了一定程度,函数f就一直比函数g大,就说函数f的增长渐近快于g”

  3)判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)。

  4)判断一个算法好不好,我们通过少量的数据时不能做出正确判断的。我们可以对比某些算法的关键执行次数函数的渐近增长性,基本就可以的得出:某个算法,随着n的增大,它会越来越优于另外一个算法,或者原来越差另一个算法。

  5)渐近增长性,是一种有些宽泛的特性。并不能根据算法的关键函执行次数的函数的渐近增长性,得出算法的精确执行时间——但可以根据这个特性,在不同的算法的对比中,得出某些算法好,那些算法不好。

2.9 算法的时间复杂度

  “在进行算法分析时,语句总的被执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作T(n)=O(f(n)),它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。”

  笔记

  1)这个定义真心不太明白,出来的真心突兀,上来就是一个破定义,真心的破定义!

  2)算法的时间复杂度,并非是算法的时间函数,而是某种度量方式,这种度量方式的用处在于对比算法之间的优劣。

  3)推到大O的方法,首先用常熟1取代运行时间的所有加法常熟,然后只保留最高阶项,最后置最高阶项系数为1。

  

常熟阶

无论n为多少,代码的执行次数都不会发生变化,我们称之为具有O(1)的时间复杂度,又叫常熟阶。不管这个常熟是多少,都记作O(1),而不能记作O(3),O(12)等其他任何数字。

线性阶

要确定某个算法的阶次,通常需要确定某个特定语句或某个语句集的运行次数,所以关键就是要分析循环结构的运行情况。

int i;
for(i=0;i<n;i++)
{
/*时间复杂度为O(1)的程序步骤序列*/
}


对数阶

int count=1;
while(count<n)
{
count=count*2;
/*时间复杂度为O(1)的程序步骤序列*/
}


平方阶

int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
/*时间复杂度为O(1)的程序步骤序列*/
}
}


/*下面的算法时间复杂度为O(m*n)*/
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
/*时间复杂度为O(1)的步骤序列*/
}
}


int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
/*时间复杂度为O(1)的程序步骤序列*/
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: