数据结构
Data Structure
一.基础概念
- 绪论
1.1 数据元素(Data Element):是数据的基本单位,在程序中作为整体进行考虑和处理
一个数据元素可由若干数据项(Data Item)组成,数据项是数据的最小单位,数据项是对客观事物某一方面特性的数据描述。
1.2 数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集。
数据结构形式定义一个二元组(D,S) D是数据元素的有限集合,S是D上数据关系的有限集合
1.3 数据结构的基本概念:相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。
1.3.1数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构包括:
- 集合
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
2. 线性结构
数据结构中的元素存在一对一的相互关系;
- 树形结构
数据结构中的元素存在一对多的相互关系;
- 图形结构
数据结构中的元素存在多对多的相互关系。
计算机软件=程序+数据+文档
1.3.2数据的物理结构:指数据的逻辑结构在计算机存储空间的存放形式。 [1]
数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。
元素之间的关系在计算机中有两种不同的表示方法:顺序存储结构和链式存储结构。
顺序结构:用数据元素在存储器中的相对位置表示数据元素之间的逻辑结构。
链式结构:在每一个数据元素中增加一个存放另一个元素地址的指针,用该指针表示数据元素之间的逻辑结构。
两种不同的存储结构对比:
顺序结构—数据元素存放的地址是连续的;
链式结构—数据元素存放的地址不一定是连续的。
在C语言中,用一维数组表示顺序存储结构;用结构体表示链式存储结构。
1.4 数据结构的三个组成部分:
逻辑结构:数据元素之间的逻辑关系 D_S=(D, S)
存储结构:数据元素在计算机中存储及其逻辑关系的表现称为数据的存储结构或物理结构。
数据操作:对数据进行的运算。
逻辑结构与采用的存储结构:
1.5 抽象数据类型(Abstract Data Type): 一个数学模型以及定义在模型上的一组操作。
ADT:具体问题的实现。
ADT定义是一组逻辑特性描述
ADT形式化定义三元组:ADT=(D,S,P) D:数据对象,S是D上的关系集,P是对D的基本操作集。
1.6 数据结构的运算:
Create:建立一个数据结构
Destory:消除一个数据结构
Delete:从一个数据结构中删除数据元素
Insert:插入一个数据元素到数据结构
Access:对数据结构进行访问
Modify:对数据结构中的元素进行修改
Sort:对数据结构进行排序
Search:对数据结构进行查找
1.7 算法
指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
算法的性质:
有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止;
确定性:算法的每一步骤必须有确切的定义;
可行性:可以有0个输入,至少有一个输出,每条运算通过有限次完成
1.7.1 算法的时间复杂度
算法效率的度量:
算法的执行时间需通过依据该算法的编制的程序在计算机上运行的时间度量
T=n(指令数)*CPI*1/时钟周期,由指令数决定
运行时间 = 算法的每条语句执行时间之和。
设每条语句执行一次所需的时间为单位,则一个算法的运行时间就是改算法中的所有语句的频度之和。
方法有一下两种:
事前统计:计算机内部执行的时间和实际占用空间的统计 (大型工程不可取)
事前分析:求出该算法的时间界限的函数,分析n的基本量级
算法中基本操作重复执行的次数是问题规模n的某个函数,其时间量度记作:
T(n) = O(f(n)), 称作算法的渐进时间复杂度,简称时间复杂度。
常用最深层循环内的语句中的原操作的执行频度来表示
表示时间复杂度的阶有:
O(1): 常量时间阶 O(N): 线性时间阶
O(logN): 对数时间阶 O(NlogN): 线性对数时间阶
O(N^k): K>=2 , k次方时间阶
Demo1:
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {
c[i][j] = 0; //已经执行了n*n次
for(k=0;k<=n;k++){
c[i][j]+=a[i][j]*b[i][j]; //执行了n*n*n次
} //总和:n^3+n^2
}
三个重复循环,从1到n,则总次数:n*n*n=n^3,其时间复杂度为T(n)=O(n^3);
六种常用的计算时间的多项式
O(1)<O(logN)<O(n)<O(NlogN)<O(n^2)<O(n^3)
指数时间关系:
O(2^n)<O(n!)<O(n^n)
判断是否是素数:O(n^1/2),因为只要和1~n之间的素数比较,次数是n/2个循环.
快捷计算:
Case 1基本语句与n无关 O(1)
Case 2 分裂原则n/2 O(log2n) //log以2为底
Case 3 单一原则,依赖n O(n)
Case 4 双循环,分裂原则 O(nlog2n)
Case 5 双循环 O(n^2)
1.7.2 算法的空间复杂度
Space complexity :算法编写程序后,在计算机中运行时所需的存储空间的大小的度量。记作:S(n) = O(f(n))
指令常数变量所占用的存储空间;
输入数据所占的存储空间;
算法原地工作是指算法的所需的辅助空间的常量,即O(1)
辅助(存储)空间。
算法的空间复杂度指的是辅助空间。
一维数组a[n]:空间复杂度 O(n)
二维数组a[n][m]:空间复杂度 O(n*m)