数据结构01
绪论:
数据结构描述现实世界实体的数学模型 (非数值计算)及其上的操作在计算机中的表示和实现
1.2基本概念
一、数据与数据结构
数据:所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作的对象的总称
是计算机处理信息的某种特定的符号表示形式
数据元素:数据中的一个“个体”,数据结构中讨论的基本单位,但不是最小单位
数据项:数据结构中讨论的最小单位,数据元素是数据项的集合
例如:运动员 (数据元素)
姓名
|
俱乐部名称
|
出生日期
|
参加日期
|
职务
|
业绩
|
年
|
月
|
日
|
组合项
数据结构:带结构的数据元素的集合,这里的数据结构是说,数据之间的约束关系,因为我们讨论的数据之间存在着一定的关系
例如:3214,6578,9345-----a1(3214) , a2(6578), a3( 9345)
在a1,a2,a3之间 存在“次序”关系
<a1,a2>、<a2,a3>
3214,6578,9345
!= 6578 ,3214 ,9345
a1
a2 a3 a2 a1 a3
又例:2行3列的二维数据{a1,a2,a3,a4,a5,a6}
a1
|
a2
|
a3
|
a4
|
a5
|
a6
|
行的次序关系:
row={<a1,a2>,<a2,a3>,<a3,a4>,<a5,a6>}
列的次序关系
col={<a1,a4>,<a2,a5>,<a3,a6>}
再例:一维数组{a1,a2,a3,a4,a6,a6}中存在
次序关系:{<a
ia
,i+1>|i=1,2,3,4,5}
说明:不同的关系构成不能的集合因此数据结构是带结构的数据元素的集合
数据的逻辑结构可归为以下四类:
线性结构
○
à○
à○
à○ 实质是一个序列
树形结构:
图形结构:
集全结构:集合中的元素不存在在关系,但在某种意义上也存在着某种关系
数据结构的形式定义为:
数据结构是一个二元组
Data_Structures=(D,S)
其中:D是数据元素的有限集,S是D上关系的有限集
数据的存储结构
-------逻辑结构在存储器中的映象或者说逻辑结构在计算机中的表示
数据元素的映象方法:
用二进制位(
bit)的位串表示数据元素
(321)
10 =(501)
8 =(101000001)
2
A=(101)
8=(001000001)
2
a1
|
a2
|
a3
|
a4
|
a6
|
a5
|
<a1,a2>
<a3,a5>
<a1,a3>
<a3,a6>
<a1,a4>
关系映象方法
(表示<x,y>的方法>
顺序映象 以存储位置的相邻表示后继关系,
Y的存储位置和X的存储位置之间差下常量C
而
C是一个隐含值,整个存储结构中只含有数据元素本身的信息
(
a1,a2,a3)是一个线性结构
a1
|
|
a2
|
|
a3
|
|
安照固定差的常量
C 安照固定差的常量C
链式映象:
在整个存储中
X,Y的存储位置是没有固定的关系,存储位置随意,这时就需要一个指针的附加信息(指针)表示后继关系,这个附加信息与X绑定在一起,X的存储映象包含一个节点,这个节点包含两部分信息,其中一部分信息是数据X的映象第二部分信息是指向后继元素的指针
二、数据类型
数据类是一个值的集全和定义在此集合上的一组操作的总称
数据类型有两种一种是简单型,一种是结构类型,一个结构类型如数组,它的结构是可以分隔的,是某个结构的集,因此这个集是一个数据结构
三、抽象数据类型(
ADT)
是一个数学模型以及定义在引数学到模型上的一组操作
ADT有两个重要特征
数据抽象
用
ADT描述程序处理的实体时,强调的是其本质的特征,其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)
1.3算法与算法的衡量
一、算法
是不解决某一问题的描述,一个算法必须满足以下五个重要特性
1. 有穷性,
2,确定性,3 可行性,4输入性,5有输出
有穷性:
任意合法输入值中的每一步必须在有有穷步骤的时间内结束
每个步骤都能在有限时间内完成
确定性:
在每一个算法里都有明确的规定,并且算法只有一条执行路径
可行性:
足够基本:把
X,Y的最大值赋给D或者增变量X的值,我们说他们不够基本
增
X的值到底增加多少?增加1,增加2都是增加,反过来,在x+1是基本的,把a,b互换也是基本的,大家一看就明白
有输入:
在算法过程中必须有输入数据也就是必须有被加工的对象,而算法表面可以没有输入,实际上已经嵌入算法之中
有输出:
与输入确定的量值,是输出结果
和算法执行时间相关的因素
1. 算法选用的策略策略不同执行时间不同
2. 问题的规模
3. 编程语言
4. 机器代码的质量
5. 计算机执行指令速度
一个特定算法的“运行工作量”依赖于问题规模的大小,
假如,随规模
n的增长,算法执行时间的增长率和f(n)增长率相同,则可记作
T(n)=O(f(n))
称
T(n)为算法的(渐近)时间复杂度
算法
=控制结构+原操作
原操作:因有数据类型的操作如:
a与b互换的操作
算法执行时间表
=Σ原操作(i)的执行次数X原操作(i)执行时间
算法执行时间与原操作执行次数之和成正比
在算法中执行的次数作算法运行时间的衡量标准
例一
, for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
c[i,j]=0;
for(k=1;k<=n;++k)
c[i,j]+=a[i,k]*b[k,j];
}
第一次运行次第二次运行
n次,第三次运行n次,因此运行时间复杂度O(n3)整个运行时间与n的3次成正比
1. 算法时间和
n(n-1)/2成正比,最次项最大项n方,也成正比,所以算法时间复杂度为0(n平方)
2. 求语句执行次数为语句的频度
,把语句频率做为算法的时间复杂度
3. 问题规模函数与输入数据无关但有的算法地不一样
四
:算法的存储空间需求
算法的空间复杂度
S(n)=O(g(n))
表示随着问题规模
n 的增大,算法运行俱存储量的增长率,与g(n)的增长率相同
算法的存储量包括
1. 输入数据占用空间
;
2. 程序本身占用空间
3. 辅助变量占用空间
若输入数据所占空间只取决于问题本身
,和算法无关,则中需要分析除输入和程序之外的辅助变量所占额外空间
若所需额外空间相对于输入数据量
(也就是问题规模)来说是常数,则称此算法为原地工作
若所需存储量依赖于物定的输入则
,通常按最坏的情况考虑