算法
- 算法的定义
- 数据结构与算法的关系
- 算法的特征
- 算法设计的要求
- 算法效率的度量方法
- 推导大O阶法
算法的定义
解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每个指令表示一个或多个操作
数据结构与算法的关系
数据结构构成数据之间的结构与关系,通过数据结构来进行更好的算法实现
算法的特征
- 输入
- 输出
- 有穷性
- 确定性
- 可行性
- 输入
零个或多个输入
- 输出
至少一个和多个输出
- 有穷性
自动结束不会死循环,并且每个步骤可以在能接受的时间内完成
- 确定性
每个步骤都有明确的含义,不会有歧义
- 可行性
每一步都能执行有限次数完成
算法的设计要求
- 正确性
- 可读性
- 健壮性
- 时间效率高
- 存储量低
- 正确性
输入、输入和加工处理无歧义性、能够正确的反应问题的需求、能够得到问题的正确答案
- 可读性
便于阅读、理解和交流
- 健壮性
当输入非法数据时,算发能做出相关处理,而不是产生莫名其妙的结果
- 时间效率高
所用时间少
- 存储量低
所占空间小
算法效率的度量方法
- 事后统计法
- 事前估算法
- 事后统计法
- 原理
通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低
- 缺陷
- 必须先编制好程序
- 依赖计算机硬件
- 数据规模对结果有影响
- 事前估算法
- 原理
在计算机程序编制之前,依据统计计算方法进行估算
两种算法的比较
求1+2+3…+100结果
int i,sum = 0;n = 100;
for(i = 1;i <= n;i++)
{
sum = sum + i;
}
printf("%d\n",sum);
int i,sum = 0;n = 100;
sum = (1 + n) * n / 2;
printf("%d\n",sum);
第一种算法:
执行次数:1+(n+1)+n+1次=2n+3次
int i,sum = 0;n = 100;//执行1次
for(i = 1;i <= n;i++)//执行n+1次
{
sum = sum + i;//执行n次
}
printf("%d\n",sum);//执行1次
第二种算法:
执行次数:3次
int i,sum = 0;n = 100;//执行1次
sum = (1 + n) * n / 2;//执行1次
printf("%d\n",sum);//执行1次
以事前估算法对两个算法进行比较,得出第二种算法优于第一种算法。
最终依据这种估算方法得出一个结论:在分析程序的运行时间效率时,最重要的是把程序看作成是独立于程序设计语言的算法或一系列步骤。
推导大O阶方法
- 用常数1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数,得到的结果就是大O阶
时间复杂度
- 时间复杂度(执行次数)
公式:T(n) = O(f(n))
他表示随着问题规模的变大,算法执行时间的增长率和f(n)的增长率相同,称作算法的逐近时间复杂度,其中f(n)是问题规模n的某个函数。
时间复杂度所消耗的时间从小到大的比较
空间复杂度
- 空间复杂度(开辟空间次数)
公式:S(n) = O(f(n))
n为问题的规模,f(n)为语句关于n所占空间的函数。