程序=数据结构+算法数据结构与算法
00x1 重要性
- 名企必考
- 竞赛重点
- 应用范围广
00x2 数据结构
数据结构是数据之间的一种或多种特定关系的集合
数据结构分为逻辑结构(数据对象中数据元素之间的相互关系)和物理结构(数据结构在计算机中的存储形式)
逻辑结构
- 集合结构:数据与数据彼此之间无关联
- 线性结构:数据与数据之间一对一
- 树形结构:数据与数据之间一对多
- 图形结构:数据与数据之间多对多
物理结构:如何把数据元素存储到存储器(主要是内存)中
00x3 存储结构
- 顺序存储结构:数据存放在连续的存储单元,必须连续;逻辑关系与物理关系一致;开销小
- 链式存储结构:数据存放在任意存储单元,不必连续;逻辑关系和物理关系不一致;需通过指针;灵活
00x4 算法
解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
特征:输入、输出、有穷性、确定性、可行性
要求:正确性、可读性、健壮性、时间效率高且存储量低
00x5 算法效率的度量方法
事后统计法
通过设计后的测试程序和数据,利用计算机计时器对不同算法编程的运行时间进行比较,从而确定算法效率的高低
缺陷:费时费力,受测试环境影响大
事前分析法
在编写计算机程序之前,依据统计方法对算法进行估算
影响效率的因素
- 算法采取的策略、方案
- 编译产生的代码质量
- 问题的输入规模
- 机器执行指令的速度
如果精确地研究执行次数是很累的,我们侧重研究的是算法随着输入规模扩大增长量的一个抽象,重要的是把基本操作的数量和输入模式关联起来
函数的渐近增长
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐近快于g(n)
常数不会影响算法的变化曲线,最高次项的系数也不重要,最重要的是最高次项的次数
00x6 时间复杂度
在进行算法分析是,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量 T(n)=O(f(n))
推导大O阶:
- 用1取代运行时间中的所有常数项
- 只保留最高次项
- 令最高次项的系数为1
大O阶的分类:
- 常数阶:O(1)
- 线性阶:O(n)
- 平方阶:O(
)
- 对数阶:O(
)
- nlog阶:O(
)
- 立方阶:O(
)
- 指数阶:O(
)
另外地,O(循环)=循环运行次数n ^ 复杂度
排列顺序:O(1)<O()<O(n)O(
)<O(
)<O(
)<O(
)
平均运行时间:期望的运行时间
最坏运行时间:所给的运行时间
00x7 空间复杂度
在一个算法运行过程中临时占用存储空间大小的度量,S(n)=O(f(n))
复杂度默认为时间复杂度。时间复杂度描述运行时间的需求,空间复杂度描述空间的需求