【计算机】数据结构-严蔚敏/清华大学P2

【计算机】数据结构-严蔚敏/清华大学P2

第一章    绪论

1.3算法和算法的衡量

一、算法

算法是为了解决某类问题而规定的一个有限长的操作序列。一个算法必须满足以下五个重要特性:

1.有穷性 2.确定性 3.可行性 4.有输入 5.有输出

1.有穷性 对于任意一组合法输入值,在执行有穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成;

2.确定性 对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径;

3.可行性 算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之;

4.有输入 作为算法加工对象的量值,通常体现为算法中的一组变量。有些输入量需要在算法执行过程输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中;

5.有输出 它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。

二、算法设计的原则

设计算法时,通常应考虑达到以下目标:

1.正确性 2.可读性 3.健壮性 4.高效率与低存储量需求

1.正确性

首先,算法应当满足以特定的“规格说明”方式给出的需求。

其次,对算法是否“正确”的理解可以有以下四个层次

a.程序中不含语法错误;

b.程序对于几组输入数据能够得出满足要求的结果;

c.程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;

d.程序对于一切合法的输入数据都能得出满足要求的结果;

2.可读性

算法主要是为了人的阅读与交流,其次才是为计算机执行。因此算法应该易于人的理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试;

3.健壮性

输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。

4.高效率与低存储量需求

通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间。两者都与问题的规模有关。

三、算法效率的衡量方法和准则

通常有两种衡量算法效率的方法:

事后统计法

缺点:1.必须执行程序

           2.其它因素掩盖算法本质

事前分析估算法

和算法执行时间相关的因素

1.算法选用的策略

2.问题的规模

3.编写程序的语言

4.编译程序产生的机器代码的质量

5.计算机执行指令的速度

P2 17:39/50:31,2021年 11月 17日 星期三 07:52:58 CST;

            一个特定算法的“运行工作量”的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数。

           假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作:

T ( n ) = O ( f ( n ) )称T( n )为算法的(渐近)时间复杂度。

如何估算算法的时间复杂度?

算法 = 控制结构 + 原操作 ( 固有数据类型的操作 )。

        算法的执行时间 = ∑原操作(i)的执行次数 x 原操作(i)的执行时间。算法的执行时间 原操作执行次数之和 成正比。

       从算法中选取一种对于所研究的问题来说是 基本操作 的原操作,以该操作 在算法中重复执行的次数 作为算法运行时间的衡量准则。

例一

        for (int i = 0; i <=n; ++i) 
            for (int j = 0; j <=n ; ++j) {
                c[i,j] = 0;
                for (int k = 0; k <=n ; ++k) 
                    c[i,j] += a[i,k]*b[k,j];
            }

基本操作:乘法操作

时间复杂度:O(n³)

例二 选择排序

void select_sort(int a[],int n){
    //
将a中整数序列重新排列成自小至大有序的整数序列.
    for(i=0;i
        j=i;
        for(k=i+1;k             if(a[k]         if(j!=i) a[j]
a[i];
    }
}// select_sort

基本操作:比较(数据元素)操作

时间复杂度:O(n² - M),语句的频度。

例三 气泡排序

void bubble_sort(int a[],int n){
    //将a中整数序列重新排列成自小至大
    //有序的整数序列。
    for(i=n-1,change=TRUE;i>1&&change;--i){
        change = FALSE;
        for(j=0;j             if(a[j]>a[j+1]){a[j]
a[j+1]};
        change = TRUE;
    }
}// bubble_sort

基本操作:赋值操作

时间复杂度:O(n²);一般都以最坏的时间复杂度情况来算。一般复杂度、平均复杂度。

四、算法的存储空间需求

       算法的空间复杂度

               S(n) = O(g(n))

       表示随着问题规模n的增大,算法运行所需存储量的增长率与g(n)的增长率相同。

算法的存储量包括:

1.  输入数据所占用空间;

2.  程序本身所占用空间;

3.  辅助变量所占用空间。

       若输入数据所占空间只取决与问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间

       若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作。S(n) = O(1);

       若所需存储量依赖于特定的输入,则通常按最坏情况考虑。

本章学习要点

1.熟悉各名词、术语的含义,掌握基本概念。

2.理解算法五个要素的确切含义。

3.掌握计算语句频度和估算算法时间复杂度的方法。

拓展:O(n)于O(loga N)的情况,趋于无穷大的时候,O(loga N)优于O(n)。

-----------------END-----------------


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部