《大话数据结构》读后总结(四)

2019-03-22  本文已影响0人  徐曙辉

一、算法

1、算法效率的度量方法

1.1 事后统计方法
1.2 事后统计方法
int i, sum = 0,n = 100;     /* 执行1次 */
for (i = 1; i <= n; i++)    /* 执行了n+1次 */
{
    sum = sum + i;          /* 执行n次 */
}
printf("%d", sum);          /* 执行1次 */

第二种

int sum = 0,n = 100;      /* 执行一次 */
sum = (1 + n) * n / 2;    /* 执行一次 */
printf("%d", sum);        /* 执行一次 */

第三种

int i, j, x = 0, sum = 0, n = 100;    /* 执行一次 */
for (i = 1; i <= n; i++)
{
    for (j = 1; j <= n; j++)
    {
        x++;    /* 执行n×n次 */
        sum = sum + x;
    }
}
printf("%d", sum);    /* 执行一次 */

这个例子中,i从1到100,每次都要让j循环100次,而当中的x++和sum=sum+x;其实就是1+2+3+...+10000,也就是1002次,所以这个算法当中,循环部分的代码整体需要执行n2次。

测定运行时间最可靠的方法就是计算对运行时间有消耗的基本操作的执行次数。运行时间与这个计数成正比。

同样问题的输入规模是n,求和算法的第一种,求1+2+...+n需要一段代码运行n次。那么这个问题的输入规模使得操作数量是f(n)=n,显然运行100次的同一段代码规模是运算10次的10倍。而第二种,无论n为多少,运行次数都为1,即f(n)=1;第三种,运算100次是运算10次的1000倍。因为它是f(n)=n2

分析一个算法的运行时间时,重要的是把基本操作的数量与输入规模关联起来,即基本操作的数量必须表示成输入规模的函数。


image

随着n值的越来越大,它们在时间效率上的差异也就越来越大。

欢迎扫描下方二维码,持续关注:

image

互联网工程师(id:phpstcn),我们一起学习,一起进步

上一篇下一篇

猜你喜欢

热点阅读