首页计算机大学计算机 04 第四章 数据与数据结构.pptx

04 第四章 数据与数据结构.pptx

页数:140页文件大小:649.7 KB来源: 大学计算机ppt课件

本课件先厘清数、数据与数据类型等基本概念,说明数据的逻辑结构与存储结构,随后依次讲解线性表、堆栈、队列等线性结构,树与二叉树的遍历,图的概念、存储与遍历,并结合迷宫求解、博弈树与AOE网关键路径说明其应用。

数据与数据结构课件封面,标示《大学计算机—计算的思想和方法》课程名称与本章主题
课程简介页,说明课程定位为计算机公共教学核心课程、授课对象为非计算机类各专业本科生,并引出本章数据与数据结构的教学目标
第4章 数据与数据结构章节导览页,列出数、数据及数据结构、线性结构、树形结构等小节,本节知识要点涵盖数据、数据类型、简单数据类型等概念
查看本课件的文字版(共 140 页,供检索与复制)

第1页:大学计算机—计算的思想和方法课程封面

《大学计算机—计算的思想和方法》课程封面,标示教材名称、第3版与编著者信息。

第2页:课程简介

  • 课程定位计算机公共教学核心课程大学通识教育类核心课程
  • 教学目标
    • 培养学生信息素养
    • 培养学生计算思维
    • 传授计算科学知识
  • 授课对象
    • 非计算机类各专业本科生
      • 第1章绪论
      • 第2章计算与计算机
      • 第3章问题求解与算法
      • 第4章数据与数据结构
      • 第5章计算机程序
      • 第6章计算机网络
      • 第7章计算科学前沿

第3页:第4章 数据与数据结构

  • 4.1 数、数据及数据结构
  • 4.2 线性结构
  • 4.3 树形结构
  • 4.4 图结构
  • 4.5 应用举例

知识要点:数,数据,数据类型,简单数据类型,构造数据类型,数据结构,抽象数据类型,逻辑结构,物理结构(存储结构),顺序存储结构,链式存储结构

第4页:4.1 数、数据及数据结构

  • 数、数据、数据结构的概念
  • 数据的逻辑结构
    • 集合
    • 线性表
    • 树
    • 图
  • 数据的存储结构
    • 顺序存储结构
    • 链式存储结构

第5页:数(Number)

  • 自然数,表示物体个数的数0,1,2,3,…
  • 整数,原始概念,是序列{...,-3,-2,-1,0,1,2,3,...}中所有的数的统称,正整数、0和负整数
  • 分数,分数源于“分”数,是一个数学术语,其定义是把单位“1”平均分成若干份,表示这样的一份或几份的数叫分数。
  • 有理数
    • 整数和分数的统称
    • 加法、减法、乘法、除法(除数不为零)4种运算

第6页:数(Number)--2无理数

  • 无理数
    • 一个正方形的边长是1的时候,对角线的长m等于多少?
    • 毕达哥拉斯学派弟子希伯斯(Hippasus,公元前625年~公元前547年)断言:m既不是整数也不是分数,是当时人们还没有认识的新数,而这种数既不是整数也不是分数,不好理解,故称无理数(irrational number)。数学史上将这一事件称为“第一次数学危机”。
    • 无理数是指实数范围内不能表示成两个整数之比的数,无理数就是10进制下的无限不循环小数。
  • 实数,有理数和无理数的统称,实实在在存在的数

第7页:数(Number)--3虚数

  • 17世纪,著名数学家、哲学家笛卡尔创造了虚数(imaginary number)的概念。虚数就是其平方是负数的数,i2=-1。
  • 当时的观念认为这是真实不存在的数字。后来发现虚数可对应平面上的纵轴,与对应平面上横轴的实数同样真实。

第8页:数(Number)--4复数

  • 19世纪初,高斯系统地使用了i这个符号,并主张用数偶(a、b)来表示a+bi,称为复数
    • i表示虚数的单位
    • a、b为实数,a、b都不等于0时叫复数,a等于0时叫纯虚数,b等于0时就是实数
  • 虚数闯进数的领域时,人们对它的实际用处一无所知,在实际生活中似乎没有用复数来表达的量
  • 现在,复数一般用来表示向量(有方向的量),在水利学、地图学、航空学中的应用十分广泛,虚数越来越显示出其丰富的内容。

第9页:数据(Data)

  • 数据(Data)是对客观事物的符号表示,他是一组表示数量、行动和目标的非随机的可鉴别的符号。它可以是数字、字母等符号。
  • 数据通常是指一切可以输入到计算机中并能被计算机程序处理的所有符号的总称。
    • 数字、字符等文本数据
    • 图形、图像数据
    • 音频数据
    • 动画、视频数据

第10页:数据抽象与数据类型

  • 数据类型,数据类型是具有同类性质的数据的抽象
    • 决定数据在计算机中所占的存储空间大小
    • 还决定数据的性质,如:数据的取值范围、操作运算等
  • 简单类型
    • 整数,实数,字符,布尔
  • 构造类型
    • 数组,结构

第11页:数据类型的意义

  • 数据存储空间大小
    • 例如:int x,y
  • 决定数据解析规则
    • 两个字节
      • 0 1 1 0 0 0 0 1
      • 0 1 1 0 0 0 1 0
    • 字符:a,b
    • int : 24934
  • 决定数据操作运算
    • 程序编译

第12页:数据结构

  • 数据结构
    • 数据之间的关系称为数据结构(Structure)
    • 逻辑结构
    • 存储结构
  • 抽象数据类型
    • 数据
    • 数据间的关系
    • 在相应存储结构下对数据的操作运算,即算法

第13页:数据的逻辑结构

  • 数据之间的逻辑关系称为数据的逻辑结构
  • 集合
  • 线性结构
  • 树形结构
  • 图状结构

第14页:集合

  • 集合的原始概念。有某种共性的东西,集中到一起,作为一个整体来看待时,就称为一个集合。
  • 集合关系:数据元素的关系非常松散,只描述数据元素是否同在一个集合中

第15页:线性结构

  • 数据元素之间存在线性关系,也称先后关系,每个元素都有一个唯一的前导元素和一个唯一的后继元素
  • 第一个元素没有前导
  • 最后一个元素没有后继。

第16页:树形结构

  • 数据元素之间呈现层次关系,在树形结构中,每一个元素通常称为一个节点,每个节点(根节点除外)有一个父节点,一个节点可以有多个子节点
  • 例如:家族族谱

第17页:图状结构

  • 元素呈多对多的关系,在图状结构中每个元素称为一个结点,图状结构又称网状结构。图结构可表达元素之间的任意关系。
  • 例如,城市之间关系,可以有不同的交通线路连接

第18页:数据的存储结构

  • 数据结构在计算机中的表示称为数据的存储结构,又称物理结构
    • 存储数据
    • 存储关系
  • 顺序存储
  • 链式存储

第19页:顺序存储结构

  • 用一组地址连续的存储单元依次存储数据集合中的元素
  • 借助于数据在存储器中的相对位置表示数据之间的关系LOC(ai) = LOC(a1)+(i-1)*l
  • 优缺点
    • 存储位置表示元素之间的关系,元素的位置可以直接计算得到,许多算法容易实现,并且效率较高,时间复杂性通常为一个常数。
    • 如果元素集合很大,顺序存储要求一块很大的连续的内存空间,这在操作系统的存储管理上可能无法满足

第20页:链式存储结构

  • 每个数据元素存储为一个结点,每个结点有一个或多个指针,指向其他结点,指针表示了结点(数据元素)之间的逻辑关系。
  • 优缺点
    • 无法用元素的存储位置表示元素之间的关系,它需要增加指针。指针增加了数据结构的存储空间要求
    • 对元素的许多操作算法,在实现上也变得较为麻烦,效率较低。
    • 链式存储增加了数据结构的灵活性,它无需事先指定元素的个数,

第21页:4.1 数、数据及数据结构

  • 4.1 数、数据及数据结构
  • 4.2 线性结构
  • 4.3 树形结构
  • 4.4 图结构
  • 4.5 应用举例

知识要点:先后关系,线性结构,线性表,线性表基本操作,堆栈,队列。

第22页:4.2 线性结构

  • 排队问题及其抽象
  • 线性表
    • 线性表的概念
    • 线性表的基本操作
    • 线性表的存储结构
  • 堆栈
    • 堆栈的概念
    • 栈的基本操作
    • 栈的表示和实现
  • 队列
    • 队列的概念
    • 队列的基本操作
    • 队列的表示和实现

第23页:排队问题及其抽象

  • 生活中排队问题
    • 车站购票、医院挂号等服务窗口的排队
    • 银行业务
    • 高速收费站、机场安检等
    • 车辆调度
  • 排队机
    • 一个队列
    • 保证了先到先服务

第24页:排队机

  • 等待叫号
  • 网上业务

本页主体为图片内容,文字版要点待对照原课件补充。

第25页:线性结构

  • 线性结构是一种描述元素先后关系的数据结构
  • 线性结构特点(1)存在一个唯一的称为“第一个”的数据元素,存在一个唯一的称为“最后一个”的数据元素;(2)除了“第一个”元素以外,每一个元素都有一个唯一的前导元素,第一个元素没有前导;除“最后一个”数据元素外,每一个元素都有一个唯一的后继元素,最后一个元素没有后继。
  • 线性表
  • 堆栈
  • 队列

第26页:线性表

  • 线性表(Linear list)是一个具有n(n≥0)个数据元素的有序序列。
  • 线性表的形式定义

第27页:线性表的基本操作

  • (1)Length(L):求线性表的长度,返回线性表中数据元素的个数。
  • (2)Get(L,i):取元素操作,返回线性表L中的第i个元素
  • (3)Locate(L,x):定位操作,给定值x,判断线性表中是否有和x相同的元素。如果存在,返回第一个和x相同的元素在线性表中的位序;否则,返回0。
  • (4)Prior(L,e):前导函数,返回线性表L中元素e的前导元素。如果e为第一个元素,返回空。
  • (5)Next(L,e):后继函数,返回线性表L中元素e的后继元素。如果e为最后一个元素,返回空。
  • (6)Insert(L,i,e):插入操作,在线性表L的第i个元素的前面插入一个元素e。
  • (7)Delete(L,i):删除操作,将线性表L的第i个元素删除。

第28页:线性表的顺序存储结构

  • 线性表的顺序存储结构可以用数组来表示

第29页:(1)Length(L)操作

  • (1)Length(L)操作,返回线性表L的长度。int Length(const SqList *l){return (*l).length;}

第30页:(2)Get(L,i)操作

  • (2)Get(L,i)操作,返回线性表L的第i个元素。ElementType Get(const SqList*l,int i){if (i<(*l).length)return (*l).elements[i-1];elseprintf("Error");}

第31页:(3)Locate(L,x),定位操作

  • 判断线性表L中是否有和x相同的元素。
  • //如果存在,返回第一个和x相等的元素在线性表中的位序;否则,返回0。
  • int Locate(const SqList *l,ElementTypex)
  • {
  • int i=0;
  • for (i=0;i<(*l).length;i++)
  • if (x= =(*l).elements[i])
  • return i+1;
  • return 0;
  • }

第32页:(4)Insert(L,i,e)

(4)Insert(L,i,e):,插入元素操作

  • (4)Insert(L,i,e),插入元素操作
  • Insert(L,i,e),插入元素操作,在线性表L的第i个元素前插入一个元素e。
  • void Insert(SqList *l,int i,ElementType e)
  • {
  • if ((*l).length==0) {
  • (*l).elements[0]=e;
  • (*l).length = 1;
  • }
  • else{
  • for (int j=(*l).length;j>=i;j--)
  • (*l).elements[j]=(*l).elements[j-1];
  • (*l).elements[i-1] = e;
  • (*l).length ++;
  • }
  • }

第33页:(5)Delete(L,i),删除操作

  • Delete(L,i),删除操作。删除线性表L中的第i个元素。void Insert(SqList &l,int i){if (i<=l.length) {for (int j=i+1;j<=l.length;j++)l.elements[j-2]=l.elements[j-1];l.length--;}}

第34页:线性表的链式存储结构

  • 链式存储结构数据类型定义

本页主体为图片内容,文字版要点待对照原课件补充。

第35页:例4-2:链式存储结构中线性表的

例4-2:链式存储结构中线性表的:Length操作算法// (1) get the length of a linar listint Length(const Node *l){int len=0;while (l!=NULL){len++;l=l->next;}return len;}

  • 例4-2:链式存储结构中线性表的Length操作算法// (1) get the length of a linar listint Length(const Node *l){int len=0;while (l!=NULL){len++;l=l->next;}return len;}

第36页:链式存储结构中线性表的Insert操作插

链式存储结构中线性表的Insert操作插:入一个新元素

  • 链式存储结构中线性表的Insert操作插入一个新元素
  • 第一个元素前
    • 空表
    • 非空表
  • 中间元素
  • 最后一个元素

第37页:Insert操作算法void

Insert操作算法void:Insert(Node *l, int i, ElementType e){int j; Node *newone,*temp;newone=(Node *)malloc(sizeof(Node));newone->data=e;//如果在第一个元素前插入元素if (i==1) {if (l==NULL) {

第38页:数据存储结构和算法的关系

  • 同样的操作,在不同的存储结构中,其算法的实现也不相同,其算法的效率可能悬殊较大。
  • 求线性表的长度操作
    • 顺序存储,时间复杂度为O(1),
    • 链式存储,却需要遍历整个单链表,复杂度为O(n)。
  • 对于插入操作
    • 顺序存储,需要大量的元素搬移
    • 链式存储,无需搬移操作。

第39页:堆栈

  • 堆栈是操作受限的线性表。在数据结构上,由于历史的原因,在中文中堆栈通常看作一个概念,堆栈即是指栈(Stack)
  • 从计算机专业讲,特别是物理存储上,堆和栈是两个不同的概念
    • 栈(Stack)
      • 是一种后进先出(Last In First Out)性质的数据结构
      • 元素采用顺序存储,编译器存放函数调用和递归调用的函数参数、临时变量、返回地址
    • 堆(Heap)
      • 是一种列队优先的数据结构,先进先出。
      • 堆通常是链式存储,例如操纵系统的动态分配内存
  • 内存管理
    • 栈区,由系统自动分配空间,速度较快。但程序员是无法控制的。
    • 堆区,是内存中开辟的一段内存空间,典型地用于动态分配和释放内存(如c语言中的malloc()和free()函数),速度较慢,且容易产生内存碎片,但使用方便,无限制。

第40页:栈结构

  • 栈(Stack)是操作受限的线性表,只在表尾进行插入和删除操作
  • 能够进行插入和删除操作的一端称为“栈顶”,另一端称为“栈底”
  • 栈是一种后进先出表。在递归算法、函数调用、面向对象程序设计等许多方面有着重要应用。

第41页:栈的基本操作

  • (1)InitStack(S):初始化操作,将栈S设为空。
  • (2)Push(S,x):入栈操作,将元素x压入栈S,成为新的栈顶元素。
  • (3)Pop(S):出栈操作,S为堆栈,若S不为空,返回S的栈顶元素,且从栈中删除该栈顶元素(退栈)。如果堆栈为空,则函数返回值为NULL。
  • (4)Gettop(S):取栈顶元素操作,S为堆栈,若S不为空,返回S的栈顶元素。如果堆栈为空,则返回值NULL。
  • (5)Empty(S):判断堆栈S是否为为空,若栈S为空,返回True,否则返回False。

第42页:栈的存储结构

  • 采用链式存储结构对栈的操作更容易实现,其元素结点结构定义同线性表的链式结构。
  • 为操作方便,可以定义下面的结构来封装栈顶、栈底指针

第43页:初始化栈InitStack(S)

  • 栈的初始值#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW-1
  • 初始化栈操作void InitStack(SqStack *S){

    第44页:入栈操作Pushint

    入栈操作Pushint:Push(SqStack *S, NODE e){

    第45页:重新分配存储器块的地址函数

    • 即重新分配存储器块的地址函数原型extern void *realloc(void *mem_address, unsigned int newsize);
    • 先判断当前指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回.
    • 如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域

    第46页:出栈操作POPint Pop

    出栈操作POPint Pop:(SqStack *S,NODE *e){

    第47页:队列

    • 队列(Queue)是一种先进先出(First In Last Out,FILO)的线性表。只能在表的一端进行插入操作,在另一端进行删除操作。
    • 允许插入的一端称为队尾(Rear),允许删除的一端称为队首(Front)。

    第48页:队列的基本操作

    • (1)InitQueue(Q):初始化操作,设置一个空的队列Q。
    • (2)EntQueue(Q,x):入队操作,将元素x插入到队列Q的尾部,成为队列新的队尾元素。
    • (3)DelQueue(Q):出队列函数,若队列Q不为空,返回Q的队首元素,且将队首元素从队列中删除。如果队列Q为空,则函数返回值为NULL。
    • (4)GetHead(Q):取队首元素,若队列Q不为空,返回Q的队首元素。如果队列为空,则函数返回值为NULL。
    • (5)CurrentSize(Q):队列大小函数,返回队列Q当前所包含的元素个数。

    第49页:队列存储结构#define

    队列存储结构#define:QueueSize 100

    第50页:队列初始化操作InitQueue

    队列初始化操作InitQueue:(Q)//(1)初始化操作,设置一个空的队列Q。void InitQueue(CircleQueue *Q){Q->front = Q->rear = 0;Q->count = 0;}

    • 队列初始化操作InitQueue(Q)//(1)初始化操作,设置一个空的队列Q。void InitQueue(CircleQueue *Q){Q->front = Q->rear = 0;Q->count = 0;}

    第51页:判队空、队满函数

    判队空、队满函数://(2)判队空int QueueEmpty(CirQueue *Q){return Q->count==0;

    第52页:入队操作EntQueue

    入队操作EntQueue:(Q,x)void EntQueue(CircleQueue *Q, DataType x){if (QueueFull(Q))Error("Queue overflow");

    第53页:出队操作DelQueue

    出队操作DelQueue:(Q)DataType DelQueue(CircleQueue *Q){DataType temp;if (QueueEmpty(Q))Error("Queue underflow");

    第54页:4.2 线性结构

    • 4.1 数、数据及数据结构
    • 4.2 线性结构
    • 4.3 树形结构
    • 4.4 图结构
    • 4.5 应用举例

    知识要点:层次关系,树形结构,树,树根,子树,结点的度,叶子(终端结点),分支结点,树的度,孩子,双亲,兄弟,祖先,子孙,树的深度,二叉树,满二叉树,完全二叉树,二叉树的遍历。

    第55页:4.3 树形结构

    • 层析关系
    • 树形结构
    • 二叉树及其性质
    • 常用操作及算法

    第56页:层次关系

    • 在我们的实际生活中,有许多数据之间的关系表现为层次关系,例如,人类社会的家族族谱、各种社会组织机构的设置、一本书的章节目录,问题决策、博弈等等,
    • 数据之间的关系都是一种层次关系,可以用树形结构来描述和建模。树形结构是一种用于描述层次关系的数据结构。

    第57页:博弈与决策问题

    • 博弈
      • 狭义的讲,博弈即下棋,对弈。
      • 现代意义,泛指在一定的游戏规则约束下,基于直接相互作用的环境条件,各参与者依靠所掌握的信息,选择各自策略(行动),以实现利益最大化和风险成本最小化的过程。
    • 只要有涉及人群的互动,就有博弈。人与人之间的博弈,组织之间的博弈,国家之间的博弈。
    • 博弈和决策是两类常见的问题,对这类问题的求解过程可以用图形来描述,这种图形就像一棵自然界中的树,称为博弈树和决策树。

    第58页:博弈树(Game Tree)

    • 博弈的过程通常可以用一颗树来描述,即博弈树(Game Tree),它描述了博弈的过程和可能的结果。
    • 井字游戏
      • 两个玩家,一个打圈O,一个打叉×,轮流在3×3的格上打自己的符号,
      • 最先以横、直、斜连成一线为胜。

    第59页:“井字棋”博弈树示例

    • 井字棋博弈过程的树状图形描述

    本页主体为图片内容,文字版要点待对照原课件补充。

    第60页:“井字棋”博弈结果分析

    • 井子棋,有9个格,树的高度最高为9层,第一层有9种选择,第二层有9*8=72中选择,第三层有9*8*7=504种选择,依次类推,则第八层有9*8*7*6*5*4*3*2=362 880种走法。最后一步,只剩一个格,由先手×占据,可见最终结果是362880种状态。
    • 在全部362880种状态中,有大量的状态是中间就已经确定了胜负,无需进一步往下走,即对应的后续走法可以“剪”枝。这样,当获胜导致游戏结束时,则只剩下255168种可能的棋局。若×是先手,则131184种棋局为×获胜,77904种棋局为O获胜,46080种棋局为平局。

    第61页:博弈问题的发展

    • 人与机器的博弈
      • 1951年,A.S. Douglas在EDSAC计算机上开发出OXO(井字游戏),开启了人与机器对弈的时代。
      • 1996年2月10日,美国IBM的深蓝计算机首次挑战国际象棋世界冠军卡斯巴罗夫,但以2-4落败,比赛在2月17日结束。
      • 1997年5月再度挑战卡斯巴罗夫,比赛在5月11日结束,最终深蓝电脑以3.5–2.5击败卡斯巴罗夫
    • 博弈论(Game Theory)
      • 研究在多决策主体之间行为具有相互作用时,各主体根据所掌握信息及对自身能力的认知,做出有利于自己的决策的一种行为理论。
      • 在经济学、管理科学、国际关系、政治学、军事战略、计算机科学和其他很多学科都有广泛的应用。

    第62页:决策问题与决策树

    • 决策问题
      • 在处理问题时,常常会面临几种可能出现的自然情况,同时又存在着几种可供选择的行动方案。此时,需要决策者根据当前状态和已知信息作决策,即选择出一种行动方案
      • 决策问题通常还涉及到各种情况发生的概率,在此基础上进行计算和推演。
    • 决策问题的求解过程可以很自然的用树状图形来描述,这就是决策树(Decision Tree)。它是一种直观的运用概率,进行可行性决策分析的图解方法,常用于项目风险评价等领域。

    第63页:决策树举例某企业准备投资一个新的项目

    决策树举例某企业准备投资一个新的项目:,市场预测表明:产品销路好的概率为0.7;销路差的概率为0.3。有三种可选方案:(1)建设大型工厂,需要投资1000万元,可使用10年。若产品销路好,每年可赢利200万元;若销路不好,每年将亏损50万元。(2)建设小型工厂,需投资300万元。如销路好,每年可赢利70万元;如销路不好,每年也会赢利50万元。(3)先建设小型工厂,若销路好,3年后扩建,扩建需投资500万元,可使用7年,扩建后每年会赢利180万元。针对上述三种可选方案,企业如何选择?

    • 决策树举例某企业准备投资一个新的项目,市场预测表明:产品销路好的概率为0.7;销路差的概率为0.3。有三种可选方案:(1)建设大型工厂,需要投资1000万元,可使用10年。若产品销路好,每年可赢利200万元;若销路不好,每年将亏损50万元。(2)建设小型工厂,需投资300万元。如销路好,每年可赢利70万元;如销路不好,每年也会赢利50万元。(3)先建设小型工厂,若销路好,3年后扩建,扩建需投资500万元,可使用7年,扩建后每年会赢利180万元。针对上述三种可选方案,企业如何选择?

    第64页:决策树

    • 计算各状态点的利润期望值
    • 点②:0.7×200×10 + 0.3×(-50)×10-1000(大厂投资)=250(万元)
    • 点⑤:1.0×180×7–500(扩建投资)=760(万元)
    • 点⑥:1.0×70×7=490(万元)

    第65页:树形结构

    • 树(tree)是n(n≥0)个结点的有限集。在一棵非空树中:(1)有且仅有一个特殊的结点,称为树根(Root);(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,且其中的每一个集合也是一棵树。T1,T2,…,Tm称为根的子树。
    • 层次关系的抽象,用于表达数据间的层次关系,是一类重要的非线性数据结构。也可表示从属关系、并列关系。

    第66页:树的表示--1树形结构

    • 树形结构

    本页主体为图片内容,文字版要点待对照原课件补充。

    第67页:树的表示—2

    • 嵌套集合表示法
    • 凹入表示法

    本页主体为图片内容,文字版要点待对照原课件补充。

    第68页:常用术语

    • 结点的度
    • 叶子(Leaf)或终端结点
    • 非终端结点或分支结点
    • 树的度
    • 孩子
    • 双亲
    • 兄弟
    • 祖先
    • 树的深度

    第69页:二叉树

    • 二叉树(Binary tree)是n(n≥0)个结点的有限集合,或者是空集,或者是由一个根和称为左右子树的两个不相交的二叉树构成。
    • 二叉树和树是两个不同的概念
      • 树的子树没有顺序,二叉树的两棵子树有左右之分。
      • 树中结点的度是任意的,二叉树中每个结点的度不能大于2。
    • 二叉树共有5种不同的形态

    第70页:二叉树的特性(1)

    • 在二叉树的第i(i≥1)层上的结点数最多为2i-1。
    • 证明
      • 当i=1时,只有一个根结点。显然,2i-1=21-1=1,命题成立。
      • 假定对所有的1
      • j<i命题成立,即在j层的结点数最多为2j-1。
      • 由归纳假设知,第i-1层上结点的最大数目为2i-2。由于二叉树中每个结点的度最大为2,因此,第i层上结点的最大数目为第i-1层上结点数目的2倍,即为2
      • 2i-2=2i-1。

    第71页:二叉树的特性(2)

    • 深度为k的二叉树至多有2k-1个结点
    • 证明

    第72页:二叉树的特性(3)

    • 对于任意二叉树T,假设终端结点数为n0,度为2的结点数为n2,则有n0=n2+1
    • 证明

    第73页:满二叉树

    • 满二叉树,若深度为k的二叉树且结点个数恰好为2k-1

    第74页:完全二叉树

    • 完全二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应

    第75页:二叉树的特性(4)

    • 具有n个结点的完全二叉树其深度为⌊log2n
      • + 1
    • 证明

    第76页:二叉树的特性(5)

    • 对一棵具有n个结点的完全二叉树中的结点,从根开始,按照从上到下,自左至右的顺序连续编号为1~n,则对于任意结点i(1
      • i
      • n)有(1)如果i=1,则结点i是二叉树的根。若i>1,则结点i的父结点的编号为⌊i/2
      • 。(2)如果结点i有左儿子,即2i
      • n,则结点i左儿子的编号为2i。(3)如果结点i有右儿子,即2i+1
      • n,则结点i右儿子的编号为2i+1。

    第77页:证明

    • 对于i=1:结点i=1为根结点,根据编号原则,如果存在左右儿子,编号应该分别为2和3。即:结点i(i=1)的左儿子编号为2(2i=2);结点i(i=1)的右儿子编号为3(2i+1=3)。因此,性质(2)、(3)成立。
    • 对于i>1:设对于结点序号1<j<i时,性质(2)、(3)成立,即:结点j的左儿子编号为2j(2j
      • n),右儿子编号为2j+1(2j+1
      • n)。下面证明j=i时命题成立。
    • 对于任意两个编号连续的结点i-1和i,存在下面两种情况
      • 结点i-1和结点i在同一层
      • 结点i-1和结点i在相邻的两层,其中结点i-1为上一层最后一个结点,结点i为下一层第一个结点

    第78页:证明(续)

    • 因为,结点j(1<j<i)的左儿子编号为2j(2j
      • n),右孩子编号为2j+1(2j+1
      • n),因此结点i-1的左孩子结点编号为2(i-1),右孩子结点编号为2(i-1)+1=2i-1。因此对于情况(a),如果结点i存在左右孩子,其编号应分别为(2i-1)+1=2i和2i+1。即当j=i时性质(2)、(3)成立。
    • 由性质(2)和性质(3)可知,对于任意结点i其父结点的编号为⌊i/2
      • ,命题成立

    第79页:常用操作及算法

    • 树的建立
    • 树的调整
      • 增加结点
      • 删除结点
    • 结点关系调整
      • 分类二叉树
      • 平衡二叉树
      • B树
    • 树的遍历

    第80页:树的存储结构

    • 二叉树的链式存储结构

    本页主体为图片内容,文字版要点待对照原课件补充。

    第81页:二叉树中序遍厉算法

    • 算法:中序遍厉二叉树算法前序遍厉:ABDEHCFG中序遍厉:DBHEAFCG后序遍厉:DHEBFGCA

    第82页:4.3 树形结构

    • 4.1 数、数据及数据结构
    • 4.2 线性结构
    • 4.3 树形结构
    • 4.4 图结构
    • 4.5 应用举例

    知识要点:任意关系,图结构,无向图,有向图,边,弧,圈,简单图,完全图,平面图,子图,真子图,支撑子图,关联,邻接,顶点的度,入度,出度,路径,通路,回路,简单路径,连通图,连通分量,强连通图,强连通分量,网,邻接矩阵,邻接表,逆邻接表,图的遍历,深度优先搜索,广度优先搜索,生成树,最小生成树

    第83页:4.4 图结构

    • 图的概念
    • 图的存储
    • 图的遍历
    • 生成树和最小生成树

    第84页:图论

    • 哥尼斯堡七桥问题的数学抽象
      • 1736年,欧拉向圣彼得堡科学院递交了关于哥尼斯堡七桥问题的论文—“与位置几何相关的一个问题的解”。在论文中,欧拉将七桥问题抽象出来,把每一块陆地考虑成一个点,连接两块陆地的桥以线表示。并由此得到了如图一样的几何图形
    • 欧拉开创了数学的一个新的分支—图论(Graph Theory)。图论的创立,为人们问题求解提供了一种新的数学理论和工具。

    第85页:图的概念

    • 图(Graph)是比线性表和树更为复杂的数据结构,图可以表达数据对象之间的任意关系。
    • 图的定义
      • 图G是由两个集合V(G)和E(G)构成的,记作G=(V(G),E(G)),或简记作G=(V,E),其中V(G)是顶点的非空有穷集合,E(G)是边的有穷集合,边表示元素之间的关系。

    第86页:图的表示

    • 图通常用图形来形象的描述,用圆圈表示顶点,连接两个顶点的线段表示边。

    第87页:有向图和无向图

    无向图,其边是顶点的无序对,
    边没有方向性。若顶点x和顶点y之间有一条边,记作(x,y)
    有向图,其边是顶点的有序对,
    边有方向性,又称为“弧”(Arc),从顶点x到顶点y的有向边(弧)用<x,y>来表示

    第88页:图相关概念--1

    • 圈,若一条边(或弧)的两个顶点相同,则称其为“圈”
    • 简单图,若图G不存在圈,也没有两边(或弧)连接同样两个顶点,则称这样的图为“简单图”。
    • 完全图,对于简单图,n个顶点的无向图最多有n(n-1)/2条边,其中任意的两个顶点之间都有边相连,称为“完全图”
    • 有向完全图,对于有向图,具有n(n-1)条弧的的简单图称为“有向完全图”。
    • 平面图,对于一个图,若存在一种画法,使其边仅在顶点处相交,则称其为“平面图”

    第89页:图相关概念--2

    • 子图,若图G={V,E}和G′={V′,E′}满足条件:
      • (1)V′
      • V;
      • (2)E′
      • E,
      • 则称G′为图G的“子图”
    • 真子图,如果G′
      • G,但G′
      • G,则称G′为图G的“真子图”,记作G′
      • G
    • 支撑子图,若G′
      • G,且V′=V,E′
      • E,即两个图的顶点集相同,而G′的边集是G的边集的子集,则称G′是图G的“支撑子图”。

    第90页:图相关概念--3

    • 关联,顶点和边(或弧)之间的关系,一条边和它所连接的顶点是相关联的。
    • 邻接,顶点和顶点之间、边和边之间的关系,和同一条边(或弧)相关联的两个顶点是邻接的,有共同顶点的两条边也是邻接的。
    • 顶点v的度,指和顶点v相关联的边的条数,记作d(v)
    • 对于有向度,度又分为“入度”(Indegree)和“出度”(Outdegree)。顶点v的“入度”是指以v为终点(弧头)的弧的条数,记作ID(v);v的“出度”是指以v为始点(弧尾)的弧的条数,记作OD(v)

    第91页:图相关概念--4

    • 路径
      • 从顶点v到顶点v′的一条路经是一个有穷非空序列w=(v=vi0,vi1,…,vik=v′),其中(vij-1,vij)
      • E
      • 路径中边的树目k称为路径的“长度”
      • 起点和终点相同的路径称为“回路”或“环”(Cycle)
      • 序列中顶点不重复出现的路径称为“简单路径”
      • 顶点v到v′存在一条路经,则称v到v′有一条“通路”

    第92页:图相关概念--5

    • 连通图
      • 在无向图中,定点vi和vj之间存在一条通路,则成vi和vj之间是连通的。若图G中,任意两个不同的顶点vi和vj之间都是连通的,则称G为“连通图”
      • 无向图的“连通分量”是它的极大连通子图。
    • 强连通图
      • 若有向图G中,任意两个不同的顶点vi和vj之间都存在一条从vi到vj和一条从vj到vi通路,则称有向图G为“强连通图”。
      • 有向图中,极大的强连通子图称为它的“强连通分量”。
    • 所谓极大,是指再加入一个顶点或边,将不满足图的连通性。一个图G的连通分量可以有多个

    第93页:图相关概念--5(举例)

    • 举例
    • 图和它的连通分量

    本页主体为图片内容,文字版要点待对照原课件补充。

    第94页:图相关概念--6

    • 网与图的权
      • 图中的边或弧往往给定一个权(Weight),这种带权的图即是网
    • 生成树
      • 一个连通图G的生成树是图G的极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。

    第95页:图的存储

    • 存储问题
      • 数据、数据之间的关系
      • 静态存储(顺序存储)和动态存储(链式存储)
      • 存储结构影响算法
    • 图的存储
      • 邻接矩阵
      • 邻接表和逆邻接表
      • 十字链表

    第96页:邻接矩阵

    • 设图G=(V,E)具有n个顶点v1,v2,…,vn和m条边e1,e2,…,em,则G的邻接矩阵是一个n
      • n阶矩阵,记作A(G)
    • 例如

    第97页:图的邻接矩阵存储结构

    图的邻接矩阵存储结构

    本页主体为图片内容,文字版要点待对照原课件补充。

    第98页:算法4-4:图的邻接矩阵构造算法

    算法4-4:图的邻接矩阵构造算法:CreateAM(MGraph &G){scanf("%d%d",&G.vexnum,&G.arcnum)

    第99页:邻接表

    • 所谓“邻接表”(Adjacency list)就是对图中的每个顶点与它相关联的所有边建立一个单链表,每个链表的头结点保存该顶点的有关信息,链内其它结点,保存与该顶点向关联的边的信息。
    • 存储结构

    第100页:图的邻接表存储结构

    • 采用邻接表存储结构,数据类型定义

    本页主体为图片内容,文字版要点待对照原课件补充。

    第101页:举例--1图G1的邻接表

    • 图G1

    本页主体为图片内容,文字版要点待对照原课件补充。

    第102页:举例—2图G4的邻接表

    • 图G4

    本页主体为图片内容,文字版要点待对照原课件补充。

    第103页:逆邻接表

    • 对有向图的每个顶点vi建立一个以vi为头的弧的链表。

    第104页:图的遍历

    • 图的遍历
      • 给定图G=(V,E)后,一个最基本的问题就是对于顶点集中的任意顶点v0,从v0出发访问图中的所有顶点,且每一个顶点只访问一次
      • 图的遍历算法是解决图的连通性问题、拓扑排序以及关键路经等算法的基础
    • 深度优先搜索
    • 广度优先搜索

    第105页:深度优先搜索

    • 深度优先搜索(Depth First Search,DFS)递归算法(1)访问v0,对v0作已访问标记。(2)找出与v0邻接未被访问的顶点w,按深度优先搜索与w邻接的未作标记的顶点。(3)若与v0邻接的顶点皆已作访问标记,则返回;否则,找出与v0邻接的未被访问的所有顶点w,按深度优先搜索与w邻接的未作标记的顶点。

    第106页:深度优先搜索(举例)

    • 举例
    • 深度优先搜索序列为:v1,v2,v4,v8,v5,v3,v6,v7

    第107页:广度优先搜索

    • 图的广度优先搜索(Breadth First Search,BFS)类似于树的按层次遍历(1)首先从顶点v(初值为v0)开始,访问v,对v作已访问标记;(2)按照字母或编号次序依次访问与v邻接且尚未访问的顶点;(3)然后再顺序从这些顶点出发,按同样原则访问邻接这些顶点的未被访问的所有顶点,直到所有顶点都被访问过为止。

    第108页:广度优先搜索(举例)

    • 举例
    • 广度优先搜索序列为:v1,v2,v3,v4,v5,v6,v7,v8

    第109页:生成树

    • 图的生成树,当G为连通图时,G的具有下列性质的子图T称为G的生成树(又称支撑树)(1)T包含G的所有顶点;(2)T为连通图;(3)T包含的边数最少。
    • 一般情况下,一个连通图的生成树不是唯一的。若连通图G有n个顶点,由n-1条边构成的包含G中所有顶点的连通子图都是G的生成树(连接n个顶点至少需要n-1条边)。

    第110页:最小代价生成树

    • 图往往是赋权图,即图中的每条边(或弧)都对应一个数,这样的图又称网
    • 在赋权图中,其生成树往往也是不唯一的,我们通常用生成树中各边的权之和来衡量生成树,称作生成树的代价。在G的所有生成树中,其代价最小的生成树称为最小代价生成树(Minimum Cost Spanning Tree),简称最小生成树(Minimum Spanning Tree,MST)
    • 在n个城市之间建立通信网络,如何选择n-1条线路,使得总的造价最低?这就是一个典型的图的最小生成树的例子

    第111页:最小生成树示例

    最小生成树示例

    本页主体为图片内容,文字版要点待对照原课件补充。

    第112页:最小生成树性质

    • 设G=(V,E)是一个连通网络,U是顶点集V的一个非空真子集。若(u,v)是G中一条“一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。

    第113页:证明MST性质

    • 假设G中任何一棵最小生成树都不含边(u,v),即若T是G的一棵最小生成树,则它不含边(u,v)。

    第114页:普里姆(Prim)算法

    • 根据MST的上述性质,可以容易的求得图的最小生成树。
      • 设G=(V,E)为赋权连通图,G的最小生成树的顶点集合为U,边的集合TE
    • 普里姆(Prim)算法

    第115页:图结构(举例)

    • 举例
    • 从顶点v1开始,U={v1}
    • 选择代价最小的边(v1,v5),将v5加入顶点集U={v1,v5}
    • 选择代价最小边(v5,v4),将v4加入顶点集U={v1,v5,v4}
    • 选择代价最小边(v5,v3),将v3加入顶点集U={v1,v5,v4,v3}
    • 选择代价最小边(v5,v6),将v6加入顶点集U={v1,v5,v4,v3,v6}
    • 选择代价最小边(v3,v2),将v2加入顶点集U={v1,v5,v4,v3,v6,v2}

    第116页:克鲁斯卡尔(Kruskal)算法

    • 由美国计算机科学家约瑟夫·克鲁斯卡尔(JosephBernard Kruskal)于1956年发明
    • 基本思想:对于具有n个顶点的图,将图中边按其权值由小到大的次序顺序选取,若选边后不形成回路,则保留作为一条边,若形成回路则除去该边。直到依次选够n-1条边为止,即得到图的最小生成树。

    第117页:4.4 图结构

    • 4.1 数、数据及数据结构
    • 4.2 线性结构
    • 4.3 树形结构
    • 4.4 图结构
    • 4.5 应用举例

    知识要点:最短路径,Dijkstra算法,AOV网络,拓扑有序,AOE网络,关键路经

    第118页:4.5 应用举例

    • 网络与最短通路问题
    • 工程拓扑排序问题
    • 工程关键路径问题

    第119页:交通问题及其抽象

    • 交通问题
      • 顶点表示城市,边表示城市之间的道路,可以带权(表示道路的长度或沿道路行驶需要花费的时间、费用等)
    • 问题
      • 从城市A到城市B有通路吗?
      • 若从城市A到城市B有多条通路,哪一条是最短的或者是最经济的呢?
    • 图的最短通路
      • Dijkstra最短路径算法
      • Floyd求所有顶点对之间的最短通路算法
      • 蚁群算法

    第120页:Dijkstra最短路径算法

    • 图的邻接矩阵存储
    • Dijkstra算法

    第121页:Dijkstra算法

    • Dijkstra最短路径算法

    本页主体为图片内容,文字版要点待对照原课件补充。

    第122页:Dijkstra算法(举例)

    • 举例
    • 图G8

    本页主体为图片内容,文字版要点待对照原课件补充。

    第123页:工程问题及其抽象

    • 在工程项目或产品加工中,除了最简单的情况外,通常需要把一个复杂的工程分成若干个子工程,一个产品的加工分成若干加工工序。完成了这些子工程或加工工序则意味着整个工程的结束或产品制造的完成。而这些子工程或加工工序之间,通常受一定条件的约束,例如,某个子工程或加工工序的开始必须在另一些子工程或加工工序结束之后。
    • 工程项目的施工或产品加工过程抽象为一个有向图,顶点表示各个子工程或加工工序,顶点之间的有向弧表示子工程或加工工序之间的约束,例如子工程之间的时间先后。

    第124页:AOV网络

    • 如果有向图为非赋权图,图中的顶点表示活动(Activity),表示一个工程的子工程或一个产品的加工工序,有向边表示活动之间的优先关系,这样的有向图称为AOV(activity onvertex)网络。

    第125页:拓扑排序

    • 所谓拓扑排序,就是产生这样的顶点序列:若网络中,vi是vj的前驱,则在序列中,vi在vj之前,有这种特性的序列称为拓扑有序。

    第126页:AOV网络拓扑分类算法Step1设一

    AOV网络拓扑分类算法Step1设一:AOV队列,并初始化为空。Step2计算每个顶点的入度,将入度为0的顶点入队列AOV。Step3如果AOV队列空,转Step4;3.1输出队首元素vi3.2在图中删除以vi为狐尾的所有弧,即对于所有的<vi,vj>,则vj入度减1。如果vj入度为0,则将vj入队。3.3转Step3。Step4.若全部顶点被输出则拓扑有序,或者网络中没有无先驱的顶点。

    • AOV网络拓扑分类算法Step1设一AOV队列,并初始化为空。Step2计算每个顶点的入度,将入度为0的顶点入队列AOV。Step3如果AOV队列空,转Step4;3.1输出队首元素vi3.2在图中删除以vi为狐尾的所有弧,即对于所有的<vi,vj>,则vj入度减1。如果vj入度为0,则将vj入队。3.3转Step3。Step4.若全部顶点被输出则拓扑有序,或者网络中没有无先驱的顶点。
    • 拓扑序列:v1,v2,v3,v4,v6,v7,v8,v5,v9

    第127页:举例—课程编列

    • 课程编列是指不同课程之间学习顺序的安排。课程之间学习顺序同样可以用AOV网结构来表达,其中顶点表示课程,顶点之间的有向弧表达课程之间的学习顺序。例如,如果存在一条有向弧<Ci,Cj>,则表明课程Ci是课程Cj的先导课程,换句话说,课程Cj是课程Ci的后续课程。
    • 在高等学校计算机基础教学领域,计算机基础教学包括7门主要课程,其教学编列如图

    第128页:工程问题及其抽象

    • 工程问题
      • 项目和产品能否顺利实施
      • 工程的工期和产品的生产周期
    • AOE(Activity On Edge)网络
      • 图的顶点表示事件,有向边表示活动,权表示活动持续的时间
      • 为了描述问题的需要,还可以增加持续时间为0的虚拟活动

    第129页:AOE网络与关键路经

    • AOE(Activity On Edge)网络
      • 图的顶点表示事件,有向边表示活动,权表示活动持续的时间
      • 为了描述问题的需要,还可以增加持续时间为0的虚拟活动
    • 关键路经
      • 在AOE网络中,某些活动可以并行进行,完成工程的最短时间是从开始顶点(也称源点)到结束顶点(又称终点)最长路径的长度(路径上所有活动的时间和)

    第130页:事件与活动的最早和最迟发生时间

    • 事件
      • 最早发生时间ve(j)
      • 最迟发生事件vl(j)
    • 活动
      • 最早发生时间ae(i)
      • 最迟发生事件al(i)

    第131页:事件的最早和最迟发生时间

    事件的最早和最迟发生时间:(1)设起点的最早时间ve(0)=0,从v0开始沿正向递推,可依次求得各事件的最早发生时间,递推公式如下:ve(j)=max{ve(i)+t(<i,j>) | <i,j>∈T,2≤j≤n},其中T是所有以j为头的弧的集合。(2)从vl(n)=ve(n)起,反向递推,可求各事件的最迟发生时间,递推公式如下:vl(i)=min{vl(j)-t(<i,j>) | <i,j>∈S,1≤i≤n-1},其中S是所有以i为尾的弧的集合。

    • 事件的最早和最迟发生时间(1)设起点的最早时间ve(0)=0,从v0开始沿正向递推,可依次求得各事件的最早发生时间,递推公式如下:ve(j)=max{ve(i)+t(<i,j>) | <i,j>∈T,2≤j≤n},其中T是所有以j为头的弧的集合。(2)从vl(n)=ve(n)起,反向递推,可求各事件的最迟发生时间,递推公式如下:vl(i)=min{vl(j)-t(<i,j>) | <i,j>∈S,1≤i≤n-1},其中S是所有以i为尾的弧的集合。

    第132页:活动的最早和最迟发生时间

    • 根据AOE网络中活动和事件的约束关系
    • ae(i)=ve(j)
    • al(i)=vl(k)-t(<j,k>)

    第133页:活动的最早和最迟发生时间(举例)

    • 举例
    • AOE网络

    本页主体为图片内容,文字版要点待对照原课件补充。

    第134页:计算结果

    • AOE网络

    本页主体为图片内容,文字版要点待对照原课件补充。

    第135页:关键路径

    • AOE网络

    本页主体为图片内容,文字版要点待对照原课件补充。

    第136页:说明--1

    • 在求顶点v5的最早发生时间ve(5)时,由于存在虚拟活动a12(对应弧<v6,v5>),因此,要考察v2、v3和v6三个顶点。虚拟活动虽然时间为0,但它改变着工程的启动顺序,因此,在上述AOE网络中,长度最长的路径是(v1,v4,v6,v5,v8,v9),而不是(v1,v4,v6,v8,v9)。
    • 活动的最早和最迟发生时间如果不相同,说明该活动的启动时间可以适当推迟,而不影响整个工程的进度。

    第137页:说明--2

    • 在关键路径上,各活动的最早开始时间和最迟开始时间相等,没有时间余量。
    • 通常情况下,缩短关键活动的工期,可以缩短整个工程的工期。但这不是绝对的,因为改变某个活动的权值,将直接影响整个AOE网络中各个事件的最早和最迟发生时间的计算,可能使的关键路径发生变化。如果活动不再是关键路径上的活动,缩短该活动的时间无法缩短整个工程的工期。

    第138页:本章小结

    4.1 数、数据与数据结构数据,数据类型
    ,简单数据类型,构造数据类型,数据结构,抽象数据类型,逻辑结构,物理结构(存储结构),顺序存储结构,链式存储结构。
    4.2 线性结构先后关系,线性结构,线性表
    ,线性表基本操作,堆栈,队列。。
    4.3 树形结构层次关系,树形结构,树
    ,树根,子树,结点的度,叶子(终端结点),分支结点,树的度,孩子,双亲,兄弟,祖先,子孙,树的深度,二叉树,满二叉树,完全二叉树,二叉树的遍历。。
    4.4 图结构任意关系,图结构,无向图
    ,有向图,边,弧,圈,简单图,完全图,平面图,子图,真子图,支撑子图,关联,邻接,顶点的度,入度,出度,路径,通路,回路,简单路径,连通图,连通分量,强连通图,强连通分量,网,邻接矩阵,邻接表,逆邻接表,图的遍历,深度优先搜索,广度优先搜索,生成树,最小生成树。
    4.5 应用举例最短路径,Dijkstra算
    法,AOV网络,拓扑有序,AOE网络,关键路经。

    第139页:问题思考

    • 数据结构是数据的关系,抽象的研究数据结构及其操作运算,有何意义?
    • 如何理解数据的存储结构对算法的影响?根据图结构,举例说明。
    • 在AOE网络中,缩短关键路径上的活动工期,一定可以缩短整个工程的工期吗?为什么?

    第140页:本章结束

    本章结束:Unit 1 Web基础谢谢大家

    • Unit 1 Web基础谢谢大家
顶部目录