数据结构
涉及数据间的逻辑关系、数据在计算机中的存储和表示和在这种结构上能执行的操作或运算三个方面面
三要素
- 逻辑结构
- 存储(物理)结构
- 运算
逻辑结构
具体问题的数学抽象,反映事物组成和逻辑关系
节点的类型
- 整数类型
- 实数类型
- 字符类型
- 指针类型
- 复合数据类型(如数组、结构类型等)
结构关系的分类
- 线性结构
- 树型结构
- 图结构
存储结构
逻辑结构在计算机中的物理存储表示,存储结构建立一种逻辑结构到物理结构的映射
四种基本存储映射方法
-
顺序
节点按地址相邻关系顺序存储,例如数组
顺序存储是紧凑存储结构
紧凑指除了有用数据之外没有附加信息
-
链接
利用存储结构中的指针指向来表达两个节点的逻辑关系,分为数据字段和指针字段两部分
优点:增删容易
缺点:定位困难
-
索引
是顺序存储的一种推广,建立一个把结点的整数索引值映射到节点存储地址的索引函数
-
散列
是索引方法的延申和扩展,定义一个把关键码映射到非负整数的散列函数
抽象数据类型
用数学方法定义对象集合和运算集合,仅通过运算的性质刻画数据对象
目的:隐藏运算实现的细节和内部数据结构
组成部分
- 数据对象
- 数据关系
- 数据操作
算法
算法的性质
- 通用性
- 有效性
- 确定性
- 有穷性
算法的分类
-
穷举法——万能、低效
-
搜索(BFS、DFS)
-
贪心法
-
递归分治(二分检索、快速排序、分治排序)
-
动态规划
算法分析
时间复杂度
大O表示法
存在正数c和n0,使得对任意 n ≥ n 0 n\ge n_0 n≥n0都有 f ( n ) ≤ c g ( n ) f(n)\le cg(n) f(n)≤cg(n),则称f(n)是O(g(n))的
-
f ( n ) → O ( g ( n ) ) 且 g ( n ) → O ( h ( n ) ) , 那么 f ( n ) → O ( h ( n ) ) f(n)\to O(g(n))\text{且}g(n)\to O(h(n)),\text{那么}f(n)\to O(h(n)) f(n)→O(g(n))且g(n)→O(h(n)),那么f(n)→O(h(n))
-
f ( n ) → O ( h ( n ) ) 且 g ( n ) → O ( h ( n ) ) , 那么 f ( n ) + g ( n ) → O ( h ( n ) ) f(n)\to O(h(n))\text{且}g(n)\to O(h(n)),\text{那么}f(n)+g(n)\to O(h(n)) f(n)→O(h(n))且g(n)→O(h(n)),那么f(n)+g(n)→O(h(n))
-
c n k → O ( n k ) cn^k\to O(n^k) cnk→O(nk)
-
f ( n ) = c g ( n ) , 则 f ( n ) → O ( g ( n ) ) f(n)=cg(n),\text{则}f(n)\to O(g(n)) f(n)=cg(n),则f(n)→O(g(n))
-
∀ a , b ∈ Z + , b ≠ 1 , l o g a n → O ( l o g b n ) \forall a,b\in Z^+,b\neq 1,log_an\to O(log_bn) ∀a,b∈Z+,b=1,logan→O(logbn)即任何对数函数无论底数如何都具有相同的增长率
-
f ( n ) + g ( n ) → O ( m a x ( f ( n ) , g ( n ) ) ) , f ( n ) ⋅ g ( n ) → O ( f ( n ) ⋅ g ( n ) ) f(n)+g(n)\to O(max(f(n),g(n))),f(n)\cdot g(n)\to O(f(n)\cdot g(n)) f(n)+g(n)→O(max(f(n),g(n))),f(n)⋅g(n)→O(f(n)⋅g(n))
Ω \Omega Ω表示法
存在正数c和n0,使得对任意 n ≥ n 0 n\ge n_0 n≥n0都有 f ( n ) ≥ c g ( n ) f(n)\ge cg(n) f(n)≥cg(n),则称f(n)是 Ω \Omega Ω(g(n))的
Θ \Theta Θ表示法
如果f(n)是O(g(n))的也是 Ω \Omega Ω(g(n))的,那么f(n)是 Θ \Theta Θ(g(n))的