一、为什么要学数据结构
数据结构课程主要研究如何求解非数值计算的问题
并且选择数据结构不仅与问题的特点和数据的种类有关,还与数据量的大小有很大的关系。
在整个考虑过程中我们需要考虑一下几点:
1.对谁做处理?(数据集合)
2.数据之间的关系是怎么样的?(数据模型)
3.需要什么样的处理工作?(干什么)
4.处理的方法和步骤如何?(怎么干)
5.算法效率?(干的怎么样)
总的来说数据结构的研究对象主要对以下对象进行研究:
数据元素的集合、数据元素之间的关系、对数据集合进行哪些运算、实现运算的算法、算法评价
因此我们结合上面可以说:从计算机类专业的专业知识结构上说,学号这门课,对学习后续课程有很大的帮助。
二、数据结构的定义
是数据存储、组织数据的方式
在计算机领域中,数据是对客观事物的描述形式和编码形式的统称。是计算机算法和程序的处理对象(输入数据)和计算结果(输出数据)。
数据的种类:数值型数据(整数、实数、浮点数),文字型数据(字符串,程序代码等),声音,记录,矩阵,图像等。
数据总是以某种编码的形式出现。
2.1数据结点
数据元素:也称数据结点简称结点。
描述一个独立事务的名称、数量、特征、性质的一组相关信息组成的一个数据接结点。
通常,一个结点含有多个数据项。
结点的类型:结构型
关键字(key)
单值类型的结点:只含一个数据项。在后面大多以单值结点代替一个结点。
例:
在一张学生成绩表中,一行学生的总成绩称为数据结点(类似于数据库里的一条记录),里面每一个元素成为关键字。
2.2数据结构
2.2.1:逻辑结构
D:有穷的结点集合 R:D中结点的有穷关系集合
B = (D,R)
这里D和R是对客观事物的抽象描述。所以(D,R)是数据的逻辑结构
2.2.2:数据结构
设D为某专业开设的计算机课程,R是定义在D上的关系
D = {C1,C2,C3,C4,C5}
R={<xx,y>|x课程是y课程的先修课,x,y(D}
若R1 = {<C1,C2>,<C2,C3>,<C3,C4>,<C4,C5>}
则DS=(D,R1)就是一种数据结构(表)
若R2 = {<C1,C2>,<C2,C3>,<C2,C4>,<C2,C5>,<C3,C5>}
则DS = (D,R2)也是一种数据结构(图)
2.2.3存储
数据结构
B = (D,R,O)
B:数据结构
D:有穷的结点集合
R:D中结点间的有穷关系集合
数据的逻辑结构
存储形式:物理结构
存储什么?
数据结点值和结点之间的关系
怎么存?
顺序存储和非顺序存储
2.2.4 物理结构
数据的存储:
存储节点:
用于存储一个数据结点的存储单元
一个数据接地点对应一个存储结点
数据结点和存储节点统称结点
空白节点:
预留的存储节点(即尚未存储数据的存储结点)
三、数据结构的种类和运算
3.1 数据结构的种类
表结构,树结构,图结构,散结构
表结构:描述结点之间简单的先后次序关系,一对一的关系,比如学生成绩表
树结构:描述结点之间的层次关系,嵌套关系,一对多的关系,比如某部门的组织结构
图结构:描述结点之间的“多对多”关系,比如城市交通网
散结构:结点之间松散的“无关关系”比如散列表
从数学角度来讲,树结构和散结构都是图的特例,表结构又是树的特例。
为了清除表示图和图示的关系,一般用圆圈表示结点,连线表示结点之间的关系
3.2 运算
运算:对数据和数据结构的操作
不同的数据结构有不同的运算。
如:表结构的常见运算:查找,插入,删除,排序等
查找:在数据结构中寻找满足某个特定要求的数据元素(位置或值)
插入:在数据结构上增添新的数据元素(指定位置,指定特征)
删除:删去数据结构中某个指定的数据元素。
四、算法
4.1 算法的概念
算法是有穷规则的集合,其中的规则规定了解决某特定类型问题的运算序列。
4.2 算法的特征
算法应具有的特征:有穷性、确定性、可行性、输入数据、输出数据。
有穷性:一个算法在执行有限步支行必须结束。
**确定性:**算法的每一步都具有确切的定义。执行者可以根据该算法的每一步要求进行操作,并最终得出正确的结果
**可行性:**算法中所有的运算都可以精确地实现
**输入:**算法有0或多个输入,即在算法开始之前,对算法给定的初始量
**输出:**算法有一个或多个输出,即与输入有某个特点定关系的亮,简单的说就是算法的最终结果
4.3 算法、数据结构与程序的关系
给定问题===》计求解问题的算法===》抽象出数据,建立数据结构===》将算法分解成对数据结构的运算===》对算法的性能进行评价===》满意?回到第二或第三步===》编程实现,并上机调试===》正确?回到上一步===》交付使用
程序是问题的最终解,成为问题的算法解,或程序解、软件解
4.4 算法的描述
算法的描述分类:程序形式、描述形式
1.程序形式
是算法的实现形式,也是算法的最终描述形式
2.描述形式
着重体现算法的主体,忽略支持算法执行的某些细节,目的是便于理解,记忆和互相交流。
目前主要的描述形式包括:自然语言、流程图、类程序设计语言
自然语言的描述形式也称文字描述形式或文字叙述形式,是算法最原始的表现形式
这种形式直接记录了人们求解问题的思维过程,简单直观。
例:自然选择排序算法
自然语言描述:
1.从n个数中选出一个最小的元素,使他作为序列的第一项
2.再从剩下的n-1个树种选出最小元素作为第二项
3.重复上述,直至选择最后一项
这种不依赖于数据结构,不涉及数据的存储形式
3.三种算法描述形式的对比
自然语言:简单易懂,适合于对算法的设计思想进行讲解;有二义性。
流程图:直观、结构性好。常用与对大型软件的结构分析和说明;有二义性。
伪代码:突出算法主题,保持了算法的良好结构,便于对算法时间,空间做定量的分析;无二义性。
五、算法的评价
1.算法的评价标准
算法评价称为算法分析
算法评价标准:
1.算法的正确性
2.算法的有效性
1.1算法正确性:
能满足具体问题的需求,且对所有的合法的输入数据都正确
- 算法的正确性是最起码的,也是最重要的。
- 一个正确的算法应当对所有合法的输入数据都能“计算”出正确的结果。
评价方法:
**1.调试:**精心挑选具有“代表性”的数据。但是只能 验证算法有错,不能证明算法无错。
**2.人工证明:**归纳法
1.2算法有效性:
算法的有效性指算法的运行效率,也就是算法投入运行时,将耗用多少时间,占用多少存储空间
**算法的时间复杂性:**算法对时间的需求。同一问题,算法执行时间越短,效率越高。
**算法的空间复杂性:**算法对空间的需求(存储空间)。
2.算法的时间复杂性
算法的时间复杂性是输入数据量n的函数,即为T(n),描述算法执行过程中所需的时间用量与问题规模n之间的函数关系。
评价算法的时间复杂性,就是设法找出T(n)和n的函数关系,即计算出T(n)
**时间单位:**每执行一条基本语句耗用一个时间单位
2.1渐进时间复杂性:
T(n) = O(f(n))
只求T(n)的最高阶,忽略其低阶项和常系数。
简化T(n)的计算;较客观的反应当n很大时,算法的时间性能。
2.2常用阶:
O(1)
O(logn)
O(n)
O(nlogn)
O(n2)
O(n^c)
以上为有效算法
。。。
O(2^n)
O(n!)
3.算法的最坏情况和平均情况
1.为什么要区分两种情况
有些算法因分支等因素,对不同的输入数据好用时间会有所不同,而且往往相差很大
为使评价更客观,更有说服力,通常需要分几种情况讨论算法的时间性能
在算法理论分析上,最常见的是分别计算出最坏情况下和平均情况下的算法的时间复杂性(也称最破坏性和平均性态)。
**最坏情况:**具有相同输入数据量的不同输入数据,算法时间用量的最大值。
Tw(n)
最坏情况下算法的时间性态可以表述算法的这一特征
**平均情况:**对于所有相同输入数据量的各种不同数据,算法好用时间的“平均值”。
Te(n)
因为数据出现的概率不一样,在讨论时一般都是加概率:期望情况,等概率:平均情况。
4.算法的空间复杂性
算法的空间复杂性是算法对存储空间的需求
算法空间用量函数S(n)
- 算法执行时所需空间:占用内存单元数
- 通常只计算辅助空间用量,不计原始数据所占的空间
为了节省时间,先做“预处理”多记一些信息(多占空间)-----时空转换
5.算法的选用原则
当数据量不大时,低阶算法未必就快。
需要考虑的因素:
- 算法实现的难易程度
- 算法使用的次数,是否实时处理
- 算法的运行环境
总原则:满足客观要求即可