绪论
计算 是对象(规律,技巧)和目标(高效,低耗)
解决一些问题或进行一些计算都要进行一些相同的步骤分析条件(进行输入),解题步骤(算法),得出结论 (做出输出)。
算法都可以被描述为若干步骤并能机械执行
子程序或子算法,一个大的程序中往往包含一些更小的程序,小的程序往往能被一些更大的程序重用。
**计算=信息处理的过程,借助某种工具,遵照一定规则,已明确而机械的形式进行
计算模型=计算机=信息处理工具
算法:特定计算模型下,旨在解决特定问题的指令序列 输入、输出、正确性、确定性、可行性、有穷性......
程序未必是算法
好算法:正确、健壮、可读、效率(速度尽可能的快;存储空间尽可能的少)
算法+数据结构=程序(DSA)
计算模型:度量
1、引入理想、统一、分层次的尺度 2、运用该尺度,测量DSA的性能
算法分析:正确性、成本(时间、空间)
划分等价类:实例的规模
特定问题+相同算法:最坏情况:T(n)=msx{T(P)| |P|=n}
特定问题+相同算法:需要抽象出一个理想的平台或模型,不依赖与种种具体的因素,从而直接准确的描述和测量算法
图灵机(TM)模型:tape依次均匀的划分为单元格,字符的种类有限,head读写头,TM总是处于有限的状态每进过一个节拍可以按照规律转向另一种状态
规范~接口
RAM模型:简单操作寄存器之间的相互赋值和条件判断,转向语句
这俩个模型都是一般计算工具的简化和抽象,使我们可以独立于具体的平台,对算法的效率做出可信的比较和判断
算法的运行时间~算法需要执行的基本操作次数
执行过程可以记录为一张表,表的行数就是所执行基本指令的总条数
**大O记号(科学记号),刻度
不去关注细微末节,更关注长远和主流
渐进的分析方法,不断地将其放大
大O相较T(n)更为简洁,但依然能反映增长趋势。常数项,低次项可以忽略
大Ω记号可以构成T(n)的下界
高效解 常数 O(1) 不含转向(循环、调用、递归等),必是顺序执行 ;对数 O (log n)
有效解 多项式复杂度O(n的c次方)
难解 指数 O(2的n次方)
**算法分析 去粗取精
俩个主要任务正确性(不变性*单调性)+复杂度
分析复杂度的主要方法:迭代(级数求和)递归(递归跟踪+递归方程) 猜测+验证
级数
算术级数与末项平方同阶
幂方级数 比幂次方高出一阶
几何级数(底数>1)与末项同阶(等比数列)
收敛级数 O(1)
循环
封底估算:定量的分析算法的复杂度
迭代和递归
减而治之:为求解一个大规模的问题,可以将其划分为俩个子问题:其一平凡,另一规模缩减分别求解子问题,由子问题的解得到原问题的解
递归跟踪:分析检查每个递归实例,累计所需时间(调用语 句本身,计入对应的子实例)其总和即算法执行时间
递归方程: 为求解规模为n的问题,需递归求解规模为(n-1)的问题。 递归基
分而治之:为求解一个大规模的问题,可以将其划分为若干子问题,规模大体相当,分别求解子问题。由子问题的解,得到原问题的解
动态规划:make it work, make it right, make it fast 消除重复计算,提高效率