【1】前言

前言

算法分析是关于计算程序性能和资源利用的理论研究。
比性能更重要的要素:

  • 模块性
  • 准确性
  • 可维护性
  • 功能性
  • 健壮性
  • 用户友好
  • 程序开发耗时
  • 简易性
  • 可扩展性
  • 可靠性

为什么学习算法分析:

  • 有时性能直接决定程序可行或者不可行
  • 算法是一种描述程序行为的语言

sorting example

排列:我们输入一组序列 a 1 , a 2 a n a_1,a_2\dots a_n ,输出 a 1 , a 1 2 a n a'_1,a1_2\dots a'_n a 1 a 2 a n a'_1 \le a'_2 \le \dots a'_n

算法时间复杂度:

  • 输入本身,如果输入本身排序好了,时间复杂度就很小
  • 输入的规模,比如序列长短
  • 通常讨论算法的最坏情况耗时

分析的种类

  • 最坏情况分析: T ( n ) T(n) 定义为输入规模为n时的最长运行时间。
  • 平均情况: T ( n ) T(n) 定义为输入规模为n时的期望运行时间。
  • 最好情况

算法时间分析

取决于电脑:

  • 相对速度(同一电脑)
  • 绝对速度(不同电脑)

算法的大局观(渐进分析):

  • 忽略依赖于机器的常量
  • 不检查实际的运行时间,关注运行时间的增长(舍弃低阶)

3 n 3 + 90 n 2 5 n + 6046 = Θ ( n 3 ) 3n^3 + 90n^2 – 5n + 6046 = Θ(n^3) ,当n足够大, Θ ( n 2 ) Θ(n^2) 终究会优于 Θ ( n 3 ) Θ(n^3) 。渐进符号的伟大之处在于,满足我们对相对和绝对速度的双重比较要求(不同的计算平台只是相差一个常数)。

插入排序

插入排序介绍


描述:先取定位置j,将j这个位置上的元素插进前j-1的序列(此时前j-1个元素的序列是排序好的了),j从2到n。

插入算法复杂度分析

最坏情况: T ( n ) = j n Θ ( j ) = Θ ( n 2 ) T(n)=\sum_j^nΘ(j)=Θ(n^2)

归并排序

归并排序介绍

在这里插入图片描述
描述:n不为1时,将序列前后分两部分,两部分排序后只要对这两个已排序序列的头元素进行比较,按顺序输出到最后结果。

归并算法复杂度分析

在这里插入图片描述
在这里插入图片描述
T ( n ) = 2 T ( n 2 ) + c n T(n) = 2T(\frac{n}{2}) + cn ,利用迭代的思想。
在这里插入图片描述
Θ ( n l g n ) Θ(n lg n) 在渐进情况下小于 Θ ( n 2 ) Θ(n^2) ,因此归并排序优于插入排序。

猜你喜欢

转载自blog.csdn.net/Jimmyzqb/article/details/82914916