数据结构之算法

数据结构+算法=程序

数据结构是对数据(操作对象)的描述,及数据的类型和组织形式,算法则是对操作步骤的描述

算法的概念

特性:

1. 有穷性:
算法中的每个步骤都能在有限时间内完成(程序可不满足此条件)
2. 确定性:
算法的每一步必须确切定义,在任何条件下算法只有一条执行路径
3. 可行性:
算法中的所有操作必需通过已实现的基本操作运算有限次实现
4. 有输入:
一个算法应有零个或多个输入
5. 有输出:
一个算法应有一个或多个输出

算法的评价标准

  1. 正确性:
    程序无语法错误;对(几组或苛刻的或一切的)输入数据可得出满足规格说明要求的结果
  2. 可读性:
    算法被理解的难易程度
  3. 健壮性:
    对非法输入的抵抗能力
  4. 高效率与低存储量需求:
    效率(算法执行时间),存储量(算法存储过程中所需的最大存储空间)均与问题规模有关

算法的描述

描述工具

自然语言、框图、高级程序设计语言

算法性能分析

衡量算法效率的方法

方法区别
事前分析估算法预先比较,比较常用
事后统计法必需在计算机实地运行程序,易有其他因素改变算法本质

算法执行时间相关因素

  1. 算法采用的策略;
  2. 算法解决问题的规模;
  3. 编程采用的语言;
  4. 编译程序产生的机器代码的质量;
  5. 执行算法的计算机速度;
    后三条受计算机硬件和软件的制约

一个特定算法的运行时间只依赖于问题的规模

一、时间复杂度

  • 定义:
    评估执行程序所需的时间,可估算出程序对处理器的使用程度;

  • 语句频度(时间频度)
    该语句在一个算法中重复执行的次数,记为 T(n);

  • 时间复杂度
    一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),它称为算法的渐进时间复杂度,简称时间复杂度。

  • 举例

  • 常数阶
    语句执行一次,时间复杂度为 O(1);
    int sum = 0,n=100; sum = (n+1)*n/2; printf("%d",sum);

  • 线形阶
    主要要分析循环结构的运行情况

for( int i = 0; i < n; i++){
//时间复杂度为O(1)的算法
......
}此算法时间复杂度为O(n)
  • 对数阶
int num = 1;
while( num < n){
num*=2;
//时间复杂度为O(1)的算法
......
}
//假设循环的次数为X,则由2^x=n得出x=log₂n,
//因此得出这个算法的时间复杂度为O(log₂n)

平方阶

for( int i = 0; i < n; i++){
   for(int j = 0; j < n; j++){
     //时间复杂度为O(1)的算法;
     ............
     }
  }
  //循环次数为 n² ,时间复杂度为O(n²)
  • 比较
    时间复杂度的对比
    在这里插入图片描述
    在这里插入图片描述
    常用的时间复杂度按照耗费的时间从小到大依次是
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)

二、空间复杂度

  1. 定义:
    评估执行程序所需的存储空间,可估算出程序对内存的使用程度,
    记为 S(n) = O(f(n))
  2. 空间复杂度所需考虑因素
    输入数据、程序本身、辅助变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值