02

严蔚敏视频 笔记02

算法必须满足5个特性:

1.有穷性 有穷步骤 有限时间

2.确定性 只有一条执行路径

3.可行性 可以通过已经实现的基本操作运算的有限次实现

4.有输入 中断输入或嵌入算法当中

5.有输出 是信息加工得到的结果 是算法的功能

 

设计原则:

1.正确性 满足特定需求

  对正确的理解:

  a.不含语法错误

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

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

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

2.可读性 便于阅读

3.健壮性 输入非法时应进行相应处理 处理出错的方法应返回一个出错的值而不是简单中断程序

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

 

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

1.事后统计法

缺点:

必须执行程序

其他因素掩盖算法本质

2.事前分析估算

 

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

1.所选策略

2.问题规模

3.编写程序的语言

4.编译程序产生的及其代码的质量

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

 

前两条与软件有关

 

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

T(n)=O(f(n))

T(n)为算法的时间复杂度

 

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

 

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

 

算法执行时间=∑原操作(i)的执行次数*原操作(i)的执行时间

 

算法执行时间与原操作执行次数之和成正比

 

某基本操作在算法中执行的次数

 

例一

for(i=1;i<=n;++i)

    for(j=1;j<=n;++j) {

        c[i,j]=0;

        for(k=1;k<=n;++k)

            c[i,j]+=a[i,k]+b[k,j];

    }

 

基本操作:乘法操作

时间复杂度:O(n^3)

 

例二

void select_sort(int a[],int n) {

    for(i=0;i<n-1;++i) {

        j=i;

        for(k=i+1;k<n;++k)

            if(a[k]<a[j]) j=k;

        if(j!=i) a[j] a[i]交换;

    }

}

 

基本操作:比较数据元素

时间复杂度:O(n^2)

 

语句的出现次数——语句的频度

最深层频度的函数

 

以上两例效率和输入数据无关,只和规模有关

 

例三

void bubble_sort(int a[],int n) {

    for(i=n-1,change=TRUE;i>1&&change;--i) {

        change=FALSE;

        for(j=0;j<i;++j)

            if(a[j]>a[j+1]) {

                a[j] a[j+1]交换;

                change=TRUE;

            }

    }

}

 

基本操作:赋值操作(交换)

时间复杂度:O(n^2) 以最坏情况来计算

平均时间复杂度 要统计概率

 

算法的存储空间需求

 

算法的空间复杂度:

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

 

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

 

存储量包括:

1.输入数据所占空间

2.程序本身所占空间

3.辅助变量所占空间

 

若额外空间相对于输入数据量来说是常量,称为原地工作

 

所需存储量依赖输入,按最坏考虑

 

本章小结:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值