目录
一、什么是数据结构
二:基本概念和术语
1.逻辑结构(Logical Structure):
2.存储结构(Storage Structure,也称物理结构)
3.数据运算
三、算法
算法的五大特性:
算法的评价指标:
1.正确性:
2.可读性:
3.健壮性:
4.时空效率:
算法性能分析与度量:
算法执行时间:
时间复杂度:T(n)=O(f(n))。
例题:求鞍点
计算机=软件+硬件
软件=程序+文档(软件工程的观点)
程序=算法+数据结构
数据结构’=计算机程序设计技巧
熟悉c语言≠写出‘好’的程序
学习数据结构=编写高水平的程序
利用计算机处理实际问题的步骤:
1,分析问题,根据问题的逻辑特征,抽象解决问题的数学模型。
2,设计数据的存储结构及解决问题的算法
3,编写程序,建立解决问题的计算机系统
4,运行和维护系统
计算机处理问题的分类(处理对象的不同):
一、数值计算问题
二、非数值计算问题
1,处理对象:字符、表格、图像、声音等各种具有一定结构的数据,
2,数据模型:没有对应的数学公式、方程
3,存储结构:需要合适的存储方式存储数据
4,当前80%以上的计算机问题
例一:人口信息查询
人口信息登记表如何构造、如何存储在计算机内存中将直接影响查找算法的设计以及算法的执行效率。
例二:人机对弈
树形结构问题 一对多
例三:最小代价问题
多对多 图状结构
结论:
●操作对象不再是单纯的数值,而是纯数值以外的表格、图像、声音等各种具有一定结构的数据。
●操作对象之间存在着诸如线性结构、树型结构、图状结构之类的多样的相互关系
★数据结构—是一门研究如何用计算机解决非数值计算问题的学科
●数据结构(Data Structure ):是指的是数据元素之间的相互关系,即数据的组织形式。
★数据结构包括三个方面
逻辑结构:数据元素间的逻辑关系;
存储结构:数据元素及其关系在计算机内的表示方式;是逻辑结构在计算机存储器中的映射
数据运算:对数据施加的操作。
是数据元素之间逻辑关系描述。
是程序员根据具体问题抽象出来的数学模型
与数据的存储无关,独立于计算机
基本的逻辑结构:
集合:任何两个数据元素都没有逻辑关系,每个元素都是孤立的。
线性结构:结构中的数据元素之间存在着一对一的线性关系。
树形结构:结构中的数据元素之间存在着一对多的关系。
图状结构:结构中的数据元素之间存在着多对多的关系。
四种逻辑结构也可以分成两类:线性结构和非线性结构。
是数据在计算机内的表示方法。
是逻辑结构的具体体现
包含数据元素本身的表示与数据元素间逻辑关系的表示
基本的存储结构
●顺序存储
数据元素依次存储在一组地址连续的存储单元中,逻辑关系由位置关系直接体现。
●链式存储
数据元素存储在一组任意的存储单元中,附加指针域表示元素间的逻辑关系。
●索引存储
结存储数据元素的同时,还建立附加的索引表,有稀疏索引和稠密索引两种方式
●散列存储
将数据元素存放在用散列函数根据数据元素关键字计算出来的地址中。
其中,顺序和链式是两种最基本的存储表示方法。
对数据施加的操作。
定义于逻辑结构。
依赖于存储结构实现。
常见的运算操作
检索(查找) 插入 删除 更新 排序
数据类型(data type ):一组性质相同的值的集合和在这个集合上定义的一组操作的总称
原子类型:其值不可再分;
C语言:char、int、float、double
结构类型:其值可分解为若干成分(或分量);
C语言:数组、结构体、共用体、文件
抽象数据类型(abstract data type ADT):一个数学模型和定义在该模型上的一组操作
抽象数据类型一般由元素、关系及操作三要素来定义
●数据结构(Data Structure )包含逻辑结构、存储结构和运算三个方面的内容。
●相同的逻辑结构,不同的存储结构得到不同的数据结构
●相同的逻辑结构、相同的存储结构,不同的运算得到的是不同的数据结构
算法(algorithm ):对特定问题求解步骤/方法的描述,是指令的有限序列。
1)有穷性:一个算法必须在执行有穷步之后结束,且每步都可在有限时间内完成。
2)确定性:算法中的每一步,必须有确切的含义,在他人理解时不会产生二义性,对相同的输入只能得同相同的结果。
3)可行性:算法中描述的每一步操作都可以通过已有的基本操作执行有限次实现
4)输入:一个算法应该有零个或多个输入
5)输出:一个算法应该有一个或多个输出
算法的描述:
●自然语言
●流程图
●程序设计语言
●伪码
算法能够正确地执行预先规定的功能,并达到所期望的性能要求
第一层次:算法没有语法错误
第二层次:对于几组输入数据能够得出满足规格说明要求的结果
第三层次:对于精心选择的经典、苛刻并带有刁难性的几组输入数据能够得出满足规格说明要求的结果
第四层次:对于一切合法的输入数据都能够得出满足规格说明要求的结果。
算法要便于人们阅读、交流与调试
(1)注释 通常用于:
a)版本、版权声明;
b)函数接口说明;
c)重要的代码行或段落提示。
(2)空行:类型声明之后; 函数定义结束之后; 函数体内,逻辑上不密切相关的语句之间
(3)代码行:一行代码只做一件事情,如只定义一个变量,或只写一条语句。if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。防止书写失误。
(4)对齐:程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{ }之内的代码块在‘{’右边数格处左对齐。
(5)变量命名:变量名称要具有确定的含义,应与其代表的内容相一致,尽量避免单个字符的变量名,除非是一次性的临时变量。
当输入数据非法运行环境改变时,算法能恰当地作出反应或进行处理,不会产生莫名其妙的输出结果。
算法的执行时间尽可能地短,占用的存储空间(辅助数据所占空间)尽可能地少
1.时间复杂度
算法转换成程序并在计算机上执行时,从开始到结束所需要的时间
2.空间复杂度
算法对输入数据进行运算所需的辅助工作单元
影响算法运行所需时间的因素:
硬件的速度 : 例如使用I3机还是使用I7机。
书写程序的语言: 实现语言的级别越高,执行效率越低。
编译程序所生成目标代码的质量:对于代码优化较好的编译程序其所生成的程序质量较高
问题的规模 : 求100以内的素数与求10000以内的素数
算法设计的好坏
结论:不能用实际时间考量算法的时间效率。
特别说明:算法的空间效率度量定义和时间效率一样,不过一个算法的空间效率是对算法运行中所需的辅助空间的度量,操作对象所占的空间不计入空间效率的度量之中。
矩阵中存在某个元素满足:是第i行中最小值且是第j行列中的最大值,则称该元素为矩阵A的一个鞍点,试编写算法找出A中的所有鞍点。
(本例主要说明用牺牲空间代价换取时间效率上的提高)
方法一:穷举法
算法思想:对每一个元素进行判别
若是第i行的最小数,则继续判别,看它是否也是第j列的最大数,如果成立则是鞍点。
当aij不是第i行的最小数或者不是第j列的最大数则选择下一个元素继续。
效率分析
方法二:
算法思路:增加两个辅助数组,将矩阵每行最小数和每列的最大数求出来,并存放在B[n]和C[m]两个一维数组中。
对B[n]和C[m]的每对元素进行比较。
若B[j]和C[i]相等,则A[i][j]一定是鞍点。
效率分析