算法和算法分析
一、算法概念
算法是对特定问题求解步骤的一种描述,是指令的有限序列
二、特性
- 有穷性
一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。 - 确定性
算法中的每一条指令必须有确切的含义,在任何条件下,只有唯一的一条执行路径即对于相同的输入只能得到相同的输出。 - 可行性
算法要足够基本,算法描述的操作可以通过已经实现的基本操作执行有限次来实现。 - 输入和输出
一个算法有零个或多个输入;有一个或多个输出。
三、设计要求
- 正确性
- 不含语法错误;
- 对于某几组输入数据能够得出满足要求的结果;
- 程序对于精心选择的典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果;
- 程序对于一切合法的输入数据都能得出满足要求
的结果.(算法维护阶段要解决的主要问题)
- 可读性
易于人的理解; - 健壮性
- 当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名奇妙的输出结果。
- 并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
- 高效率与低存储需求
- 效率指的是算法执行时间
- 存储量指的是算法执行过程中所需的最大存储空间。
两者都于问题的规模有关
四、算法效率的度量
4.1 基本思路
- 算法 = 控制结构(顺序、分支、循环)+原操作(固有数据类型的操作)
- 算法的执行时间 = ∑(原操作(i)的执行次数×原操作(i)的执行时间 )
即: 算法的执行时间 与 原操作执行次数之和 成正比
- 基本操作:该操作重复执行次数和算法的执行时间成正比。
- 算法的运行时间由算法中所有语句的频度之和(该语句重复执行次数)构成。
- 算法的时间复杂度是由嵌套最深层语句的频度决定的。
4.2 度量效率方法
- 事后统计
将算法实现,测算其时间和空间开销。缺点:⑴ 必须执行程序,编写程序实现算法将花费较多的时间和精力;
⑵ 所得实验结果依赖于计算机的软硬件等环境因素。 - 事前分析
对算法所消耗资源的一种估算方法。
4.3 与执行时间相关因素
- 算法选用的策略
- 问题的规模
- 编写程序的语言
- 编译程序产生的机器代码的质量
- 计算机执行指令的速度
所以使用绝对时间单位衡量算法效率不合适
五、算法的存储空间需求
S(n) = O(g(n))
表示随着问题规模n的扩大,算法运行所需存储量的增长率与 g(n) 的增长率相同。
算法存储量
- 输入数据所占空间
- 程序本身所占空间
- 辅助变量所占空间
- 若输入数据所占空间只取决与问题本身,和算法无关,程序所占的空间是细微的,比较少,则只需要分析辅助变量所占额外空间*
- 原地工作:若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。(即输入n组数据,n不确定,但对应的辅助变量所占空间固定)
- 若额外空间所占空间量依赖于特定的输入,均按最坏情况来分析。