数据结构是计算机存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
定义
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。
记为:Data_Structure=(D,R)
其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。
结构分类
逻辑结构
逻辑结构,指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构是在计算机存储中的映像,形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。
- 集合
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
- 线性表
数据结构中的元素存在一对一的相互关系;线性表是最简单、最基本、也是最常用的一种线性结构。 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,通常记为: (a1,a2,… ai-1,ai,ai+1,…an) ,其中n为表长, n=0 时称为空表。 它有两种存储方法:顺序存储和链式存储,它的主要基本操作是插入、删除和检索等。
- 树
数据结构中的元素存在一对多的相互关系;
- 图
数据结构中的元素存在多对多的相互关系。
物理结构
物理结构,指数据的逻辑结构在计算机存储空间的存放形式。
- 顺序结构
顺序结构:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序结构。顺序结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。
- 链式结构
链式结构:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式结构,链式结构通常借助于程序设计语言中的指针类型来实现。
- 索引结构
索引结构:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。 - 散列结构
散列结构:就是根据结点的关键字直接计算出该结点的存储地址。
算法分析
算法是为了解决某类问题而规定的一个有限长的操作序列。
- 对算法的性能进行分析,便于算法的比较和选用。
- 时间复杂性分析和空间复杂性分析
通常有两种衡量算法效率的方法:
事后统计法
缺点:1、必须执行程序 2、其它因素掩盖算法本质
事前分析估算法
渐进时间复杂性分析方法:
- 确定算法的主要操作
- 计算主要操作执行的次数
- 一般的讲,执行次数是输入的函数
- 根据函数的特点,得到函数所属的阶(order)
示例:求S = 1 + 2 + 3 +…+n
int s=0, i, n;
scanf( "%d“, &n );
for( i=1; i<=n; i++) {
s = s + i;
}
printf(“%d“, s);
输入的长度:n
主要操作:加法
执行加法的次数:n
函数关系:f(n)=n
算法的时间复杂性:T(n) =O( n)
算法的空间复杂性:S(n) = O(1)
函数的分类(Big O notation)
符号表示 | 描述 | 特征 | 案例 |
---|---|---|---|
O(1) | 常数复杂度(Constant Complexity ) | 不受数据规模的影响 | 判断一个数的奇偶 |
O(log n) | 对数复杂度(Logarithmic Complexity) | 数据规模不断减半 | 二分查找 |
O(n) | 线性时间复杂度(Linear Complexity) | 给定一个长度为n的序列求最大值 | |
O(nlogn) | 线性对数阶 | 对于一个长度为n的无序序列A排序、归并排序 | |
O(n^2) | 平方(N square Complexity:) | i=0, j=0的双重for循环 | |
O(n^3) | 立方(N square Complexity) | i=0, j=0, k=0的三重for循环 | |
O(2^n) | 指数(Exponential Growth:) | 斐波那契数列(F(n) = F(n-1) + F(n-2))求F(n) | |
O(n!) | 阶乘(Factorial) | 生成1~n的所有排列 |
常用数据结构Big O
Big O Cheat Sheet
主定理(Master Theorem)
参考资料:
https://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms)