基本的数据结构
基本概念
- 数据结构 = 数据的逻辑结构(线性+非线性) + 数据的存储结构(顺序存储+链式存储)+ 数据的运算(检索、排序、插入、删除、修改等)
- 数据:能够输入计算机且能被计算机处理的各种符号的集合,包括数值型和非数值型两种数据
- 数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理(也称为元素、记录、结点、顶点),是数据集合的个体
- 数据项:构成数据元素的不可分割的最小单位
数据>数据元素>数据项(学生表>个人记录>学号、姓名…) - 数据对象:性质相同的数据元素的集合,是数据的一个子集,是数据集合的子集(也是集合)
- 数据结构:数据元素不是孤立存在的,它们之间存在着某种关系,数据元素相互之间的关系称为结构;指相互之间存在一种或多种特定关系的数据元素集合;是带结构的数据元素的集合。
包括逻辑结构、物理结构或存储结构、数据的运算和实现
- 逻辑结构的种类:①线性结构和非线性结构;②集合结构(只同属于一个集合)、线性结构(一对一)、树形结构(一对多)、图状结构或网状结构(多对多)
- 存储结构的种类:顺序存储结构、链式存储结构、索引存储结构、散列存储结构
- 数据类型:一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。 数据类型 = 值的集合 + 值集合上的一组操作
- 抽象数据类型(ADT):形式定义:抽象数据类型可用(D,S,P)三元组表示,D是数据对象,S是D上的关系集,P是对D的基本操作
抽象数据类型 = 数据的逻辑结构 + 抽象运算
定义格式
ADT 抽象数据类型名{
数据对象<数据对象的定义>
数据关系<数据关系的定义>
基本操作<基本操作的定义>
}ADT 抽象数据类型名
*eg:*圆的定义
ADT Circle {
数据对象:D = {r,x,y| r,x,y均为实数}
数据关系:R = {<r,x,y>|r是半径,<x,y>是圆心坐标}
基本操作:
Circle(&C,r,x,y)
操作结果:构造一个圆
double Area©
初始条件
:圆已存在
操作结果:计算面积
double Circumference©
初始条件:圆已存在
操作结果:计算周长
}ADT Circle
- 算法的五大特性:有穷性、确定性(没有二义性)、可行性、输入(0或多个)、输出(1或多个)
- 算法设计的要求:正确性、可读性、健壮性、高效性,接着考虑效率
- 算法效率:①时间效率:指的是算法所耗费的时间 ②空间效率:指的是算法执行过程中所耗费的存储空间
- 算法时间效率的度量:①事后分析:测算②事前分析:估算
- 事前分析方法:算法运行时间 = 一个简单操作所需的时间 × 简单操作次数
算法运行时间 = 每条语句的执行次数(语句的频度) × 该语句执行一次所需的时间
因为执行语句的时间是由机器的硬件决定的,因此一般假设每条语句执行的时间都是单位时间,算法运行时间=频度之和
eg1:
for (i = 1; i <= n; i++) //执行n+1次,因为最后一步还要判断i=n+1与n的关系
for (j = 1; j <=n; j++) //执行n*(n+1)次,//因为最外层循环执行了n次,而该语句执行了n+1次
c[i][j] = 0; //执行nn次 //因为第一层循环执行了n次,第二层循环执行了n次,总共nn次
for (k = 1; k <= n; k++) //执行nn(n+1)次 //因为第二层循环内部的语句总要执行nn次,而该语句本身要执行n+1次
c[i][j] = c[i][j] + a[i][k] * b[k][i]; //执行nnn次 //因为第二层循环内部的语句总要执行nn次,而该语句在第三层循环内部要执行n次
因此可算出算法的时间消耗T(n) = 频度之和 - 时间复杂度: 为了便于比较不同算法的时间效率,仅比较数量级,称为算法的渐进时间复杂度,简称时间复杂度,O(f(n))
- 最坏时间复杂度/平均时间复杂度
- 复杂度(低→高): O(1) < O(log2(n)) < O(n) < O(n log2 (n)) < O(n^2) < O(n ^3)… < O(2 ^n)
- 渐进空间复杂度:空间复杂度,S(n) = O(f(n))
算法要占据的空间:①算法本身要占据的空间:输入/输出、指令、常数、变量 ②算法要使用的辅助空间