数据的逻辑结构与存储结构的基本概念
逻辑结构分为四种类型
- 集合结构:元素同属一个集合,元素之间没有什么关系。
- 线性结构: 典型的有顺序表,链表,栈和队列。 元素之间是一对一关系。
- 树形结构:二叉树,元素之间是一对多关系
- 图形结构:有向图与无向图。元素之间是多对多的关系。
物理结构(又称存储结构)分为两类
- 顺序结构:元素在连续的存储单元中,物理顺序与逻辑顺序是一致的,比如数组。优点是访问速度快,缺点是插入和删除操作耗时久。
- 链式结构:元素可以在不连续的存储单元中,通过指针指向前驱节点或者后驱节点,有点是插入和删除都很快。
算法的定义、基本性质以及算法分析的基本概念,包括采用大O形式表示时间复杂度和空间复杂度
- 算法的定义:是为了求解问题给出的有限指令序列,每条指令表示一个或多个操作。
- 算法的基本性质:
- 输入:一个算法有0个或多个输入,这些输入取自某个特定对象的集合。
- 输出:一个算法有一个或多个输出,这些输出是同输入具有某种特定关系的量
- 确定性:算法中每一条指令必须有确切的含义,不具有二义性
- 可行性:算法中描述的操作都可以用已经实现的运算执行有限次来实现。
- 有穷性:一个算法必须能够在执行又穷步骤后结束,并且每一步都能在又穷时间内完成。
算法分析
- 事前估计法:时间按复杂度估计。 抽象过程如下:算法运行时间=每条语句执行时间之和-》每条语句的执行次数之和-》基本语句的执行次数-》基本语句执行次数的数量级-》大O号表示。常见的时间复杂度如下Ο(1)<Ο(log₂n)<Ο(n)<Ο(nlog₂n)<Ο(n²)<Ο(n³)<…<Ο(2ⁿ)<Ο(n!)
- :算法运行所需要的时间称为时间复杂性;算法运行所需要的辅助空间称为空间复杂性
描述 | 增长的数量级 | 典型代码 | 说明 | 举例 |
常数级别 | Ο(1) | a=b+c | 普通语句 | 将两个数相加 |
对数级别 | Ο(log₂n) | 二分查找 | 二分查找 | 二分查找 |
线性级别 | Ο(n) |
for(int i=0;i<N;i++){ } |
循环 | 找出最大元素 |
线性对数级别 | Ο(nlog₂n) | 分治 | 归并排序 | |
平方级别 | Ο(n²) |
for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ } } |
双层循环 | 检查所有元素对 |
立方级别 | Ο(n³) | 代码省略 | 三层循环 | 检查所有三元组 |
指数级别 | Ο(2ⁿ) | 穷举查找 | 检查所有子集 |
- 事后统计法:程序运行测试。 比如在调用某个方法的前后打印当前时间,以此来判断该方法执行耗时,缺点是需要编写特定程序,且硬件环境影响测试结果(比如服务器与pc机器性能不同,同样的算法在这2者之间运行的时间是不一样的)