~Ooops:本篇博文为观看严蔚敏第二版的数据结构书籍所做的总结性笔记,
有错误请望指出?
一. 什么是数据结构?
首先来介绍什么是程序?
程序 = 算法 + 数据结构
我们知道程序设计是为计算机处理问题编制的一组指令集 。
但是带来两个问题:
1.怎样进行处理? 2.数据怎么表示?
算法可以通俗的理解为 处理问题的策略。而数据结构数据结构则是问题的数学模型。
概括的说,数据结构描述现实世界实体的数值模型(非数值运算)及其上的操作在计算机中的表示和实现。
二.基本概念和术语
一. 数据: 所有能被输入到计算机中,且被计算机处理的符号的集合计算机操作对象的总称,是计算机处理的信息的某种特定的符号的表现形式 。
二. 数据元素:数据中的一个“个体”,数据结构中讨论的基本单位。
三.数据项:数据结构中讨论的最小单位,数据元素是数据项的集合。
例如:
运动员的信息(数据元素)
包括 【姓名 , 俱乐部 ,国际 ,出生年月日 ....】
姓名,或者是俱乐部就是数据项 。
同时,出生年月日由 年, 月 , 日 组成 ,
这里也称 数据项出生年月日为 组合项。
四. 数据结构:带结构的数据元素的集合。即在任何问题中,数据元素不是孤立存在的,他们直接存在某种关系,这种关系被称为结构(Structure)。数据结构包括三部分内容:逻辑结构,存储结构,数据运算
比如: 对于数值 375 ,
其中 3 , 7 , 5 存在一种次序关系, 设 a1 = 3 , a2=7,a3=5 ,
则存在的次序关系是: <a1,a2> , <a2 , a3> .
不同的关系,构成不同的结构。
对上数据结构的三部分内容开始探讨:
1.逻辑结构 : 逻辑结构可以分为四种 :
1.线性结构
2.树形结构
3.图状结构
4.集合结构 (和数学上理解的集合是一致的)。
至于图示,你们自己网上找咯?~
数据结构的形式定义: 定义为一个二元组:
Data_Structes = (D , S)
其中 : D: 数据元素的有限集。 S: D上关系的有限集。
2. 存储结构: 指的是逻辑结构在存储器中的映象。
由上述的定义得:数据的形式定义为数据元素和数据元素上的关系。自然,有两种映象:
1.数据元素的映象: 用二进制位(bit)的位串表示数据元素。
2.数据元素上的关系映象:(表示例如上述的次序关系<x , y>的方法):
同时对于关系映象,有两种次序关系:
1.顺序映象: 以存储位置的相邻表示后继关系。
2.链式映象(非顺序映象):以附加信息(指针)表示后继关系。
当然,在不同环境中,上述的表现形式略有不同。
五.数据类型:在用高级语言程序编写的程序中,必须对程序出现的每个变量,常量,表达式明确说明他们的数据类型。
总的来说: 数据类型是一个值的集合和定义在集合上的一组操作的总称。同时数据类型分为基本数据类型和结构数据类型。
三. 抽象数据类型(Abstract Data Type 简称 ADT)
定义:是指一个数学模型以及定义在此数学模型上的一组操作。
也就是:
抽象数据类型 = 数据结构 + 定义在此数据结构上的一组操作
ADT的描述方法:
形式定义:我们用一个三元组 (D,S,P)来表示一个 抽象数据类型 ,其中D是数据对象,S是D上的关系集,P是对D的基本操作集。
格式: ADT 抽象数据类型名{
数据对象:〈数据对象的定义〉
数据关系:〈数据关系的定义〉
基本操作:〈基本操作的定义〉
} ADT 抽象数据类型名
同时基本操作的定义格式为:
基本操作名(参数表)
初始条件:〈初始条件描述〉
操作结果:〈操作结果描述〉
Notes: ADT的表示和实现: 抽象数据类型需要通过固有的数据类型(高级语言已经实现的基本类型)来实现。
四.算法和算法的衡量。
算法定义: 算法是为了解决某类问题而规定的一个有限长的操作序列。
算法的特性:1.有穷性。2.确定性。 3. 可行性 。4. 输入。 5.输出。
算法的设计原则:1. 正确性 。 2.可读性 。 3.健壮性。 4. 高效率和低存储量的需求。
算法效率的衡量方法和准则:
- 一.事后统计法
缺点: 必须先执行,还有 其他因素 掩盖了算法本质。
-
二. 事前分析估算法
和算法执行时间相关的因素:
一. 算法选用的策略
二.问题的规模
三.编写程序的语言
四.编译程序产生机器代码质量
五.机器执行指令速度
时间复杂度:程序运行从开始到结束所需要的时间。
假设设解决一个问题的规模为n,基本操作被重复执行的次数是n的一个函数f(n),假如,随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,则可记作
其中T(n)叫算法的渐进时间复杂度,简称时间复杂度。
如何估算算法的时间复杂度?
算法=控制结构+原操作(固有数据类型的操作)
算法的执行时间=∑原操作(i)的执行次数╳原操作(i)执行时间
从算法中选取一种对于所研究的问题来说是基本运算的原操作,以该原操作重复执行的次数作为算法运行时间度衡量准则。
显然,被称做问题的基本操作的原操作应是其重复执行次数和算法的执行时间成正比的原操作,多数情况下是最深层循环内的语句中的原操作,它的执行次数和包含它的语句频度相同。
空间复杂度:算法所需存储空间的度量。
记作:
算法的存储量包括:
(1)输入数据所占空间;
(2)程序本身所占空间;
(3)辅助变量所占空间。
如果所需的辅助变量所占空间为常数,则称此算法为原地工作。
如何估算算法的空间复杂度?
一般空间复杂度主要的衡量标准为 辅助变量所需的空间,所以,只要观察程序运行过程中所需辅助空间的大小即可。
五. 必须要掌握的内容
看完了这一节,你需要掌握的东西有:
1.熟悉各名词,术语的含义,掌握基本概念,特别是“数据结构”。
2.理解算法五个要素的确切含义。
3. 掌握计算语句频度和估算算法时间复杂度的方法。