数据结构(第一章 : 绪论)
基本概念 :
- 数据 : 信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。
- 数据元素 : 数据的基本单位,通常作为一个整体进行考虑和处理
- 数据项 : 一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
- 数据对象 : 具有相同性质的数据元素的集合,是数据的一个子集。
- 数据结构 : 相互之间存在一种或多种特定关系的数据元素的集合。
数据结构 :三要素
-
逻辑结构 :指数据元素之间的逻辑关系,即从逻辑关系上描述数据。
-
集合结构
-
线性结构
- 一对一
-
树形结构
- 一对多
-
图形结构
- 多对多
-
逻辑结构与数据的存储无关,是独立于计算机的。数据的逻辑结构分为线性结构和非线性结构,线性表是典型的线性结构;集合、树和图是典型的非线性结构。
-
数据运算 : 针对于某种逻辑结构,结合实际需求,定义基本运算
-
存储结构(物理结构):指数据结构在计算机中的表示(又称映像),也称物理结构。
- 顺序存储
- 链式存储
- 索引存储
- 散列存储
存储结构包括数据元素的表示和关系的表示。数据的存储结构是用计算机语言实现的逻辑结构,它依赖于计算机语言。数据的存储结构主要有顺序存储、链式存储、索引存储和散列存储。
数据类型
-
一个值的集合和定义在此集合上的一组操作的总称。
- 1)原子类型。其值不可再分的数据类型。
- 2)结构类型。其值可以再分解为若干成分(分量)的数据类型。
-
抽象数据类型( Abstract Data Type,ADT ) 是抽象数据组织及与之相关的操作。
- ADT 用数学化的语言定义数据的逻辑结构、定义运算。与具体的实现无关。
算法
基本概念
-
程 序 = 数 据 结 构 + 算 法 程序 = 数据结构 +算法 程序=数据结构+算法
-
算法 (Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条表示一个或多个操作。
五个特性
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
设计算法的要求
- 正确性
- 可读性
- 健壮性
- 高效率与低存储
- 时间复杂度
- 空间复杂度
算法效率的度量
时间复杂度
-
全称 : 渐进时间复杂度
-
算法时间复杂度 :事前预估算法时间开销 T ( n ) T(n) T(n) 与问题规模 n n n 的关系 (T表示"time")
-
大 O O O表示"同阶", 即相同的数量级, 当 n → ∞ n \rightarrow \infty n→∞时 二者之比为常数
- 即 x 的数量级为 O ( x ) O(x) O(x)
- 举个大栗子 :
- T 1 ( n ) = 2 n + 1 T_1(n) = 2n+1 T1(n)=2n+1 化简为 T 1 ( n ) = O ( n ) T_1(n) = O(n) T1(n)=O(n)
- T 2 ( n ) = 2 n 2 + n T_2(n) = 2n^2+n T2(n)=2n2+n 化简为 T 2 ( n ) = O ( n 2 ) T_2(n) = O(n^2) T2(n)=O(n2)
- T 3 ( n ) = 3 n 3 + n 2 T_3(n) = 3n^3+n^2 T3(n)=3n3+n2 化简为 T 3 ( n ) = O ( n 3 ) T_3(n) = O(n^3) T3(n)=O(n3)
-
因此算法时间复杂度可只考虑阶数高的部分,当问题的规模足够大时, 常数项系数可以忽略
-
时间复杂度的大 O O O 运算规则
-
加法 : 多项相加,只保留最高阶的项,且系数变为1
- T ( n ) = T 1 ( n ) + T 2 ( n ) = O ( f ( n ) ) + O ( g ( n ) ) = O ( m a x { O ( f ( n ) ) , O ( g ( n ) ) } ) T(n) = T_1(n)+T_2(n) = O(f(n))+ O(g(n))=O(max\{O(f(n)), O(g(n))\}) T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max{O(f(n)),O(g(n))})
- 举个栗子 :
T
1
(
n
)
=
2
n
+
1
T_1(n) = 2n+1
T1(n)=2n+1 和
T
2
(
n
)
=
2
n
2
+
n
T_2(n) = 2n^2+n
T2(n)=2n2+n
做加法 : T 1 ( n ) + T 2 ( n ) = O ( 2 n + 1 ) + O ( 2 n 2 + n ) = O ( n 2 ) T_1(n)+T_2(n) = O(2n+1)+ O(2n^2+n)=O(n^2) T1(n)+T2(n)=O(2n+1)+O(2n2+n)=O(n2)
-
乘法 : 多项相乘,都保留
-
T ( n ) = T 1 ( n ) × T 2 ( n ) = O ( f ( n ) ) × O ( g ( n ) ) = O ( f ( n ) × g ( n ) ) T(n) = T_1(n)\times T_2(n) = O(f(n))\times O(g(n))=O(f(n)\times g(n)) T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))
-
举个栗子 : T 1 ( n ) = 2 n + 1 T_1(n) = 2n+1 T1(n)=2n+1 和 T 2 ( n ) = 2 n 2 + n T_2(n) = 2n^2+n T2(n)=2n2+n
做乘法 : T ( n ) = T 1 ( n ) × T 2 ( n ) = O ( 2 n + 1 ) × O ( 2 n 2 + n ) = O ( ( 2 n + 1 ) × ( 2 n 2 + n ) ) = O ( n 3 ) T(n) = T_1(n)\times T_2(n) = O(2n+1)\times O(2n^2+n)=O((2n+1)\times(2n^2+n))=O(n^3) T(n)=T1(n)×T2(n)=O(2n+1)×O(2n2+n)=O((2n+1)×(2n2+n))=O(n3)
-
-
-
时间复杂度大小比较
- 常见的时间复杂度比较 O ( 1 ) < O ( log 2 n ) < O ( n ) < O ( n log 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1) < O(\log_2 n) < O(n) < O(n\log_2 n) < O(n^2 ) < O(n^3 )< O(2^n )< O(n!) < O(n^n ) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
- 注 : 有时在计算机科学中一般 log n \log n logn 就是指以2为底的对数, 直接省略了2
-
最坏时间复杂度:最坏情况下算法的时间复杂度
-
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
-
最好时间复杂度:最好情况下算法的时间复杂度
空间复杂度 (非重点)
- 空间开销(内存开销)与问题规模 n n n 之间的关系
- 若无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,则称该算法的空间复杂度为 S ( n ) = O ( 1 ) S(n) = O(1) S(n)=O(1) 注: S 表示 “Space”
- 算法原地工作 是指算法所需的辅助空间为常量,即 O ( 1 ) O(1) O(1)
- 空间复杂度的大 O O O 运算和时间复杂度的大 O O O 运算一样, 都是问题规模的数量级运算
- 函数递归调用带来的内存开销等于递归调用的深度
- 大部分算法都是以空间换时间, 先是优化时间复杂度再考虑空间复杂度。
未完待续….
参考资料 :
- 23版王道408数据结构单科书
- 王道考点精讲视频课件