为什么学习这门课程
- 编程基础
- 计算机及相关专业考研考博课程
- 程序员考试课程
- 计算机等级考试课程
课程学习指导
课程特点:内容抽象 概念性强 内容灵活 不易掌握
- 1.提前预习 认真听课 多敲代码
- 2.注意先修课程的知识准备:离散数学 C语言
- 3.注意循序渐进:基本概念 基本思想 基本步骤 算法设计
- 4.注意培养算法设计的能力:理解所讲算法 对此多做思考:若问题要求不同,应如何选择数据结构,设计有效算法
第1章 绪论
学习目标
- 1.了解数据结构 研究的主要内容
- 2.掌握数据结构中涉及的 基本概念
- 3.掌握算法的时间 空间复杂度及其分析的简易方法
教学内容
- 1.1 数据结构的研究内容
- 1.2 基本概念和术语
- 1.3 抽象数据类型的表示与实现
- 1.4 算法与算法分析
1.1 数据结构的研究内容
N.沃斯(Niklaus Wirth)教授提出:
程序 = 算法 + 数据结构
电子计算机的主要用途:
早期:
主要用于数值计算(量大 复杂)
后来:
处理逐渐扩大到非数值计算领域,能处理 多种复杂的具有一定解构关系的数据(字符 表格 图像)
求解非数值计算的问题:
- 设计出合适的 数据结构 及相应的 算法;
- 即:首先要考虑对相关的各种信息如何表示 组织和存储?
- 数据结构(学科):
- 一门研究非数值计算的程序设计问题中计算机的操作对象(数据)以及它们之间的关系和操作等的学科
数据结构课程的形成和发展:
<数据结构>所处的地位:
数据结构在计算机学科中的地位:
课程目的
- 能够分析研究计算机加工的对象的特性,获得其逻辑结构,根据需求,选择合适存储结构及其相应的算法;
- 学习一些常用的算法;
- 复杂程序设计的训练过程,要求编写的程序结构清楚和正确易读;
- 初步掌握算法的时间分析
- 和空间分析技术
1.2基本概念和术语
>1.数据 (data)---所有输入到计算机中去的描述客观事物的符号;
- 数值性数据
- 非数值性数据(多媒体信息处理)
>2.数据元素(data element) ----数据的基本单位,也称结点(node)或记录(record)
- 通常作为一个整体进行考虑和处理
>3.数据项(data item) ---有独立含义的数据最小单位,也称域(field)
- 一个数据元素可由若干个数据项组成
- 三者之间的关系: 数据 > 数据元素 > 数据项
- 例:学生表 > 个人记录 > 学号 姓名...
>4.数据对象(Data Object):相同特性数据元素的集合,是数据的一个子集
- 整数数据对象
- N = {0,+-1,+-2,...}
- 学生数据对象
- 学生记录的集合
>5.数据结构 (Data Structure) 是相互之间存在一种或多种特定关系的数据元素的集合
- 数据结构:是带 结构 的数据元素的集合;
- 结构: 就是指数据元素之间存在的关系
数据结构的形式定义;
数据结构是一个二元组:
Data-Structure = (D, S)
其中, D是数据元素的有限集, S是D上关系的有限集
数据结构的两个层次:
*逻辑结构: 数据元素之间的逻辑关系
- 从具体问题抽象出来的数学模型
- 数据元素间抽象化的相互关系
- 与数据的存储无关 独立于计算机
存储结构(物理结构) 数据元素及其关系在计算机存储器中的存储方式
逻辑结构
逻辑结构划分方式2
存储结构
数据的运算
逻辑结构和存储结构都相同,但运算不同,则数据结构不同!
- 例如:栈 队列
对于一种数据结构,常见的算法有:
- 插入(增) : 往数据结构中增加新的结点
- 删除(删) : 把指定的结点从数据结构中去掉
- 修改(改) : 改变指定节点的一个或多个字段的值
- 查找(查) : 也称检索,在数据结构里查找满足一定条件的结点 一般是给定一个某字段的值,找具有该字段值的结点
- 排序 : 把结点按某种指定的顺序重新排列.例如递增或递减
<数据结构与算法>的三方面研究内容:
- 数据的逻辑结构: 数据之间的逻辑关系, 与数据存储无关, 独立于计算机;
- 数据的(物理)存储结构: 数据在计算机的具体存储实现方式, 依赖与计算机;
- 数据的操作实现算法; 按一定逻辑结构组织的数据所具有的各种操作, 其对应算法如何在具体存储结构上的实现
数据类型
1.3 抽象数据类型的表示与实现
抽象数据数据类型可以通过 固有的 数据类型(如整型 实型 字符型等) 来表示和实现
它有些类似C语言中的结构体(struct)类型,但增加了相关的操作
往后描述用的类C语言 (介于伪码和C语言之间) 作为描述工具
上机时要用具体语言实现, 如 C或C++等
(1)预定义常量及类型
//函数结果状态代码
- #define OK 1
- #definr ERROR 0
- #define OVERFLOW -2
(2)数据元素被约定为ElemType类型,用户需要根据具体情况,自行定义该数据类型
(3)算法描述为以下的函数形式:
函数类型 函数名 (函数参数表)
{
语句序列;
}
(4)内存的动态分配与释放
/C++使用new和delete动态分配和释放内存空间
- 分配空间 指针变量 = new数据类型;
- 释放空间 delete指针变量;*/
int *p; p = (int *)malloc(sizeof(int)); char *ptr = NULL; ptr = (char *)malloc(100 * sizeof(char));
(5)赋值语句
(6)选择语句
(7)循环语句
(8)使用的结束语句形式有:
函数结束语句 return
循环结束语句 break
异常结束语句 exit(异常代码)
(9)输入输出语句形式有:
输入语句 scanf() //cin
输出语句 printf() //cout
1.4算法与算法分析
算法定义: 一个有穷的指令集, 是对特定问题求解步骤的一种描述;
- 每条指令表示一个或多个操作
算法的描述 :
- 自然语言
- 流程图
- 程序设计语言
- 伪码
T <-0 T <-2 While I<500 ...
算法的特性 :
- 输入 有0个或多个输入
- 输出 有一个或多个输出(处理结果)
- 确定性 每步定义都是确定的 无歧义的
- 有穷性 算法应在执行有穷步后结束
- 可行性(有效性) 算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现
算法设计的要求(评价)
正确性
- 正确性的4个层次:
- 1.程序不含语法错误
- 2.程序对几组输入数据能够得出满足规格说明要求的结果
- 3.程序对精心选择的典型 苛刻且带有刁难性的几组输入数据能够得出满足规格说明要求的结果
- 4.程序对一切合法的输入数据都能产生满足规格说明要求的结果
可读性
- 算法主要是为了人的阅读和交流 ,应该好读, 有利于阅读者对算法的理解
健壮性
- 鲁棒性, 算法应具有容错处理, 当输入非法数据时, 算法应对其作出恰当反应, 而不是产生莫名其妙的输出结果
高效性(时间代价和空间代价)
- 效率指的是算法执行的时间; 存储量需求指算法执行过程中所需要的最大存储空间 通常, 这两者与问题的规模有关.
算法与程序的关系
程序是算法在计算机系统中的具体实现
- 与所用的软硬件平台以及程序设计语言有关
算法是对程序中计算过程本质的抽象与描述, 是计算方法在抽象计算模型上的一种实现
- 只注重抽象数据对象的操作序列, 不关心数据对象的存储表示和语言表达
算法效率的度量
算法执行时间用依据该算法编制的程序在计算机上执行所消耗的时间来度量
- 事后统计
- 事前分析估计
事后统计 : 利用计算机内的计时功能, 不同算法的程序可以用一组或多组相同的统计数据以分辨优劣(收集该算法的程序的实际执行时间或实际占用空间的统计资料)
- 缺点 :1.必须先运行依据算法编制的程序
- 2.所得的时间统计量依赖于硬件 软件等环境因素, 掩盖算法本身的优劣
事前分析估计 : 根据一定的方法, 估算该算法的执行时间或空间需求的界限函数
一个高级语言程序在计算机上运行所消耗的时间取决于:
- 依据的算法选用何种策略
- 问题规模(处理数据量的大小)
- 程序语言
- 编译程序产生机器代码质量
问题规模
撇开与计算机软硬件相关的因素, 可以认定一个特定的算法的"运行工作量"的大小只依赖于问题的规模(通常用整数n表示), 或者说, 它是问题规模的函数
- 算法进行事前分析估算, 就是要对问题规模n与该算法在运行时所消耗的时间T以及所占用的空间S给出一个数量关系评价, 即T(n)和S(n)
时间复杂度的渐进表示法
算法中基本语句重复执行的次数是问题规模n的某个函数f(n), 算法的时间量度记作:
- T(n)=O(f(n))
时间复杂度的递增顺序
渐进空间复杂度
小结
1.数据 数据元素 数据项 数据结构等基本概念
2.对数据结构中的;两个层次的理解
- 逻辑结构
- 存储结构
3.抽象数据类型的表示方法
4.算法的时间复杂度及其分析的简易方法