91
计计计计计计计计计 (3) 计计计计计计计

计算机软件技术基础 (3)

Embed Size (px)

DESCRIPTION

计算机软件技术基础 (3). 算法与数据结构. 设计程序首先要研究要解决的问题,提出适当的 计算模型 并列出解决问题的方法和步骤。 模型一旦建立起来,就要选择合适的 算法 ,并将解题步骤表述出来;同时需要确定合适的 数据结构 本章着重讨论解决问题的核心 -- 算法 以及算法的处理对象 -- 数据的结构. 如何解决农夫过河问题 一个农夫带着一只狼、一只羊和一棵白菜,身处河南岸,要把东西全部运到北岸。约束条件是只有一条能容下他和一件物品的小船,只有农夫能撑船。不能单独留下羊和白菜,也不能单独留下羊和狼,狼不爱吃白菜。. 3 .1 算法. - PowerPoint PPT Presentation

Citation preview

计算机软件技术基础(3)

算法与数据结构

计算机软件技术基础

设计程序首先要研究要解决的问题提出适当的计算模型并列出解决问题的方法和步骤

模型一旦建立起来就要选择合适的算法并将解题步骤表述出来同时需要确定合适的数据结构

本章着重讨论解决问题的核心 -- 算法以及算法的处理对象 -- 数据的结构

如何解决农夫过河问题一个农夫带着一只狼一只羊和一棵白菜身处河南岸要把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

31 算法 解题过程的准确完整的描述称作解该问题的算法算法

程序程序就是用计算机语言表述的算法流程图流程图就是图形化了的算法

著名计算机科学家 PASCAL 语言发明者 Nmiddot 沃思 (Niklaus Wirth)

教授进一步提出如下的著名公式

程序=算法+数据结构

mdashmdash 不能离开数据结构去抽象地分析程序的算法也不能脱离算法去孤立地研究程序的数据结构而只能从算法与数据结构的统一上去认识程序

计算机软件技术基础

311 算法的两要素算法由操作与控制结构两要素组成

11 操作操作

(1) 逻辑运算 ldquo与rdquoldquo或rdquoldquo非rdquo

(2) 算术运算 加减乘除

(3) 数据比较 大于小于等于不等于

(4) 数据传送 输入输出赋值

计算机软件技术基础

2 2 控制结构控制结构

算法的控制结构决定了各操作的执行次序用 流程图 流程图 可以形象地表示出算法的控制结构

任何复杂的算法都可以用顺序选择循环三种控制结构组合而成( 1966 年 Bohm和 Jacopini 证明)

S1

S2

B

S1 S2 B

S

(a) (b) (c)

S3

F

T

BF

T

(d)

S

312 算法的特征

1 算法是由一套计算规则组成的一个过程

2 组成算法的规则是确定的可执行的

3 每种算法必须有确定的结果产生一个或多个输出

4 每个算法必须有 0 个(自动生成初始数)或多个输入

5 解答必须在有限步内得到 不能出现ldquo死循环rdquo

我们可以得出如下的结论我们可以得出如下的结论算法是一个过程这个过程由一套明确的规则组成这些规则指定了一个操作的顺序以便用有限的步骤提供特定类型问题的解答

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

设计程序首先要研究要解决的问题提出适当的计算模型并列出解决问题的方法和步骤

模型一旦建立起来就要选择合适的算法并将解题步骤表述出来同时需要确定合适的数据结构

本章着重讨论解决问题的核心 -- 算法以及算法的处理对象 -- 数据的结构

如何解决农夫过河问题一个农夫带着一只狼一只羊和一棵白菜身处河南岸要把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

31 算法 解题过程的准确完整的描述称作解该问题的算法算法

程序程序就是用计算机语言表述的算法流程图流程图就是图形化了的算法

著名计算机科学家 PASCAL 语言发明者 Nmiddot 沃思 (Niklaus Wirth)

教授进一步提出如下的著名公式

程序=算法+数据结构

mdashmdash 不能离开数据结构去抽象地分析程序的算法也不能脱离算法去孤立地研究程序的数据结构而只能从算法与数据结构的统一上去认识程序

计算机软件技术基础

311 算法的两要素算法由操作与控制结构两要素组成

11 操作操作

(1) 逻辑运算 ldquo与rdquoldquo或rdquoldquo非rdquo

(2) 算术运算 加减乘除

(3) 数据比较 大于小于等于不等于

(4) 数据传送 输入输出赋值

计算机软件技术基础

2 2 控制结构控制结构

算法的控制结构决定了各操作的执行次序用 流程图 流程图 可以形象地表示出算法的控制结构

任何复杂的算法都可以用顺序选择循环三种控制结构组合而成( 1966 年 Bohm和 Jacopini 证明)

S1

S2

B

S1 S2 B

S

(a) (b) (c)

S3

F

T

BF

T

(d)

S

312 算法的特征

1 算法是由一套计算规则组成的一个过程

2 组成算法的规则是确定的可执行的

3 每种算法必须有确定的结果产生一个或多个输出

4 每个算法必须有 0 个(自动生成初始数)或多个输入

5 解答必须在有限步内得到 不能出现ldquo死循环rdquo

我们可以得出如下的结论我们可以得出如下的结论算法是一个过程这个过程由一套明确的规则组成这些规则指定了一个操作的顺序以便用有限的步骤提供特定类型问题的解答

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

31 算法 解题过程的准确完整的描述称作解该问题的算法算法

程序程序就是用计算机语言表述的算法流程图流程图就是图形化了的算法

著名计算机科学家 PASCAL 语言发明者 Nmiddot 沃思 (Niklaus Wirth)

教授进一步提出如下的著名公式

程序=算法+数据结构

mdashmdash 不能离开数据结构去抽象地分析程序的算法也不能脱离算法去孤立地研究程序的数据结构而只能从算法与数据结构的统一上去认识程序

计算机软件技术基础

311 算法的两要素算法由操作与控制结构两要素组成

11 操作操作

(1) 逻辑运算 ldquo与rdquoldquo或rdquoldquo非rdquo

(2) 算术运算 加减乘除

(3) 数据比较 大于小于等于不等于

(4) 数据传送 输入输出赋值

计算机软件技术基础

2 2 控制结构控制结构

算法的控制结构决定了各操作的执行次序用 流程图 流程图 可以形象地表示出算法的控制结构

任何复杂的算法都可以用顺序选择循环三种控制结构组合而成( 1966 年 Bohm和 Jacopini 证明)

S1

S2

B

S1 S2 B

S

(a) (b) (c)

S3

F

T

BF

T

(d)

S

312 算法的特征

1 算法是由一套计算规则组成的一个过程

2 组成算法的规则是确定的可执行的

3 每种算法必须有确定的结果产生一个或多个输出

4 每个算法必须有 0 个(自动生成初始数)或多个输入

5 解答必须在有限步内得到 不能出现ldquo死循环rdquo

我们可以得出如下的结论我们可以得出如下的结论算法是一个过程这个过程由一套明确的规则组成这些规则指定了一个操作的顺序以便用有限的步骤提供特定类型问题的解答

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

311 算法的两要素算法由操作与控制结构两要素组成

11 操作操作

(1) 逻辑运算 ldquo与rdquoldquo或rdquoldquo非rdquo

(2) 算术运算 加减乘除

(3) 数据比较 大于小于等于不等于

(4) 数据传送 输入输出赋值

计算机软件技术基础

2 2 控制结构控制结构

算法的控制结构决定了各操作的执行次序用 流程图 流程图 可以形象地表示出算法的控制结构

任何复杂的算法都可以用顺序选择循环三种控制结构组合而成( 1966 年 Bohm和 Jacopini 证明)

S1

S2

B

S1 S2 B

S

(a) (b) (c)

S3

F

T

BF

T

(d)

S

312 算法的特征

1 算法是由一套计算规则组成的一个过程

2 组成算法的规则是确定的可执行的

3 每种算法必须有确定的结果产生一个或多个输出

4 每个算法必须有 0 个(自动生成初始数)或多个输入

5 解答必须在有限步内得到 不能出现ldquo死循环rdquo

我们可以得出如下的结论我们可以得出如下的结论算法是一个过程这个过程由一套明确的规则组成这些规则指定了一个操作的顺序以便用有限的步骤提供特定类型问题的解答

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

2 2 控制结构控制结构

算法的控制结构决定了各操作的执行次序用 流程图 流程图 可以形象地表示出算法的控制结构

任何复杂的算法都可以用顺序选择循环三种控制结构组合而成( 1966 年 Bohm和 Jacopini 证明)

S1

S2

B

S1 S2 B

S

(a) (b) (c)

S3

F

T

BF

T

(d)

S

312 算法的特征

1 算法是由一套计算规则组成的一个过程

2 组成算法的规则是确定的可执行的

3 每种算法必须有确定的结果产生一个或多个输出

4 每个算法必须有 0 个(自动生成初始数)或多个输入

5 解答必须在有限步内得到 不能出现ldquo死循环rdquo

我们可以得出如下的结论我们可以得出如下的结论算法是一个过程这个过程由一套明确的规则组成这些规则指定了一个操作的顺序以便用有限的步骤提供特定类型问题的解答

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

312 算法的特征

1 算法是由一套计算规则组成的一个过程

2 组成算法的规则是确定的可执行的

3 每种算法必须有确定的结果产生一个或多个输出

4 每个算法必须有 0 个(自动生成初始数)或多个输入

5 解答必须在有限步内得到 不能出现ldquo死循环rdquo

我们可以得出如下的结论我们可以得出如下的结论算法是一个过程这个过程由一套明确的规则组成这些规则指定了一个操作的顺序以便用有限的步骤提供特定类型问题的解答

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

313 算法的表示 算法设计一般是由粗到细的过程一般可以使用下面几种类型的工具描述算

自然语言

用自然语言描述算法通俗易懂但它存在着难以克服的缺陷 易产生歧义性自然语言往往要根据上下文才能判别其含义不太严格

语句比较繁琐冗长并且很难清楚地表达算法的逻辑流程如果算法中包含判断循环处理尤其是这些处理的嵌套层数增多自然语言描述其流程既不直观又很难表达清楚

当今的计算机尚不能处理用自然语言表示的算法

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

专用工具 常用的有流程图 PAD 图和 N-S 图伪代码等

程序设计语言

算法描述语言 为了便于转换成某种编程语言一般采用准程序设计语言作

算法描述语言在本书中为类 VB 语言

继续

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

流程图 是采用不同的几何图形来描述算法的逻辑结构每个几何图形表示不同性质的操作

开始

结束

(a) 起止框连接框 (b) 输入输出框

A

Aab输入 Ngt10

(c) 判断框

true

false

(d) 处理框

i+1rarri

(e) 注释框 (f) 流向线

N为正整数

常用流程图符号常用流程图符号

返回

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

类 VB 语言一览表

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

类 VB 语言一览表(续)

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

1 枚举法(穷举法))

基本思想是 先依据题目的部分条件确定答案的大致范围 在此范围内对所有可能的情况逐一验证直到全部情况验证

完 若某个情况使验证符合题目的条件则为本题的一个答案若全部情况验证完后均不符合题目的条件则问题无解

314 314 常用算法常用算法

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

2迭代法

使一个复杂问题的求解过程转化为相对简单的迭代算式的重复执行过程

使用迭代法构造算法的基本方法是

首先确定一个合适的迭代公式选取一个初始近似值以及解的误差

然后用循环处理实现迭代过程终止循环过程的条件是前后两次得到的近似值之差的绝对值小于或等于预先给定的误差

并认为最后一次迭代得到的近似值为问题的解

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

3递归法

如果一个过程直接或间接地调用它自身则称该过程是递归的

例求阶乘 Func fac(n As Integer) If n=1 then fac=1 Else fac=nfac(n-1) Endif

1 n=0 n=

n(n-1) ngt0

递归过程必须有一个递归终止条件

当 n=0 时定义为 1 是阶乘递归定义的递归出口

递归则是从函数本身出发逐次上溯调用其本身求解过程直到递归的出口然后再从里向外倒推回来得到最终的值

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

4递推法

所谓递推法它的数学公式也是递归的只是在实现计算时与递归相反从给定边界出发逐步迭代到达指定计算参数

例求阶乘

f(n)= n = ntimes(n-1) = ntimesf(n-1)

要计算 10 可以从递推初始条件 f(0)=1 出发应用递推公式f(n)=ntimesf(n-1)逐步求出 f(1) f(2)hellip f(9) 最后求出 f(10) 的值

递推操作是提高递归函数执行效率最有效的方法科技计算中最常见

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

5 分治法

解一个复杂的问题时尽可能地把这个问题分解为较小部分找出各个的解然后再把各部分的解组合成整个问题的解这就是所谓的分治法

66回溯法回溯法

在那些涉及到寻找一组解的问题或者满足某些约束条件的最优解的问题中有许多可以用回溯法来求解

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

回溯法的算法是 Proc Backtracking(succ Boolean)Proc Backtracking(succ Boolean)

确定起始状态值走第一步

确定下一步还有几种可能

选一可能走下一步记住可能和本步特征

做完新一步应做的事

While 目标未达到 do

确定下一步有几种可能

While 没有可能 and 还有上一步 do

回退上一步

查有无下一可能

Enddo

If 上一步没有了 Then return (SUCC=FALSE)

EndIf选一可能走一步记住可能和本步特征 做完新一步应做的事

Enddo

return (SUCC=TRUE)

End BacktrackingEnd Backtracking

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

315 算法分析 评价一个算法是否完善我们主要关心以下三个问题

算法的复杂度 时间复杂度 ---- 执行算法的计算工作量即算法的时间代价 衡量算法工作量的方法

执行算法所需时间作为算法工作量的度量 算法程序中所执行的指令条数或语句条数作为度量 语句执行的次数作为度量

空间复杂度 ---- 执行算法所需的内存空间包括 算法程序所占的空间 输入初始数据所占的空间 算法执行过程中所需的额外空间包括

算法执行过程中的工作单元 数据结构所需的附加空间

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

算法的最优性 ----衡量算法的好坏主要依据算法的复杂度特别是时间复杂度通常总是在最坏的情况下分析算法的工作量 最优算法是指在解决一个问题时如果在被研究的算法类中没有一个算法比现有算法执行更少的基本运算则称此算法是最优的

快速算法的设计 ---- 与工程上常用的算法相比其时间复杂度较小 快速算法不一定是最优算法

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

32 数据结构 321 数据结构概述

11 数据结构的研究内容数据结构的研究内容 数据的逻辑结构数据的存储结构数据的运算

数据的逻辑结构数据的逻辑结构 Data-Structure = (DR)

其中 D 是数据元素的集合 R是 D 上关系的集合

一般将数据结构分为两大类线性数据结构和非线性数据结构线性数据结构有线性表栈队列串数组和文件非线性数据结构有树和图

程序中的数据运算是定义在数据的逻辑结构上的但运算的具体实现要在存储结构 ( 物理结构)上进行每种逻辑结构都有一个运算集合常用的运算有检索插入删除更新排序等

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

2 研究方法

最基本的数据结构为表其他数据结构都转化为表处理

方法 研究数据结构的逻辑结构的运算性质 研究数据结构的物理结构 根据物理结构和运算性质写算法(集合)

逻辑结构和物理结构是相对的

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

322 线性表 线性表的逻辑结构是 n个数据元素的有限序列

(a1 a2 a3hellipan)

n 为线性表的长度 (nge0) n=0 的表称为空表

数据元素呈线性关系 必存在唯一的称为ldquo第一个rdquo的数据元素 必存在唯一的称为ldquo最后一个rdquo的数据元素

除第一个元素外每个元素都有且只有一个前驱元素 除最后一个元素外每个元素都有且只有一个后继元素

所有数据元素 ai在同一个线性表中必须是相同的数据类型

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

线性表按其存储结构可分为顺序表和链表用顺序存储结构存储的线性表称为顺序表顺序表用链式存储结构存储的线性表称为链表链表

线性表的基本运算主要有(1)在两个确定的元素之间插入一个新的元素(2) 删除线性表中某个元素(3) 按某种要求查找线性表中的一个元素需要时还可找到元素进行值的更新

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

11 顺序表和一维数组顺序表和一维数组 将线性表中的数据元素依次存放在某个存储区域中 所形成的表称为顺序顺序

表表一维数组一维数组就是用顺序方式存储的线性表其下标可看成元素的相对地址

运算

(1) (1) 插入插入在线性表 (a1 a2hellip ai ai+1hellip an) 的第 i个位置插入元素x 算法如下

Sub Insert(ByRef ATypenix) If(ilt1) Or (igtn+1) Then ERROR(ldquo位置不存在rdquo ) Else For j=n Down To i A(j+1)=A(j) Next j Endif A(i)=x n=n+1 End

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

(2)(2) 删除删除在表长为 n的线性表 (a1a2hellipai-1aaiiai+1hellipan) 中删除第 i

个数据元素通常还需将第 i+1 个至第 n 个元素向前推动一个

位置即 (a1 a2 hellip ai-1ai+1 hellip an) 其算法描述如下

PROC DELETE (VAR AVAR nI)If (ilt1) Or (igtn) Then ERROR (位置不存在 ) ELSE FOR j=i TO n-1 A(j)=A(j+1) Next j n=n-1 EndifEnd

bull在顺序表中插入或删除元素时每进行一次插入或删除都要移动近乎一半的元素

bull对于长度可变的线性表必须按可能达到的最大长度分配空间

顺序表的不足顺序表的不足

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

2链表(1(1 )单链表)单链表 ( 线性链表 ) 链式存储的线性表

结点除信息域外还含有一个指针域用来指出其后继结点的位置

最后一个结点没有后继结点指针它的指针域为空 ( 记为 NIL 或and ) 另外还需要设置一个指针 head 指向单链表的第一个结点

info next

信息域 指针域

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

链表的一个重要特点是插入删除运算灵活方便不需移动结点只要改变结点中指针域的值即可

a b

Head

a b

Head

x

and

插 入 插 入

a c

Head

b and

删 除删 除

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

(2 )循环链表循环链表和单链表的差别仅在于链表中最后一个结点的指针域不为ldquo NILrdquo 而是指向头一个结点成为一个由链指针链结的环

(3(3 )双向链表)双向链表设有一个指向后继结点的指针和一个指向前驱结点的指针

1结点 2结点 n结点

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

3栈 栈 (STACK) 也是一种特殊的线性

表是一种ldquo后进先出rdquo的结构它的运算规则受到一些约束和限定故又称限定性数据结构

(1(1 )栈的结构特点)栈的结构特点

栈是限定仅在表尾进行插入和删除运 算 的线性表 表尾称为栈顶(top) 表头称为栈底 (bottom)

栈的物理存储可以用顺序存储结构也可以用链式存储结构

(22 )栈的运算)栈的运算 设置一个空栈 判定栈是否为空 进栈退栈 读取栈顶元素等

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

应用 括号匹配

(a(b+c)+d) 写出匹配括号的程序 思路

从左到右扫描字符串把所遇到的左括号压入堆栈每当遇到一个右括号就把它与栈顶的左括号(如存在)匹配同时从栈顶弹出该左括号

十进制到八进制数的转换

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

栈的变形

在使用多个栈的时候采用单个数组存在缺陷() 空间利用率不高

可以在一个数组中表达多个堆栈 尤其是在表达两个堆栈的时候

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

4队列(1 )队列的结构特点

队列也是一种特殊的线性表在实际生活中经常要靠排队来维护正常的社会秩序在计算机程序设计中也有类似的问题数据结构中的队列与生活中的ldquo排队rdquo极为相似也是按ldquo先来到先解决rdquo的原则行事的既不允许ldquo加塞儿rdquo也不允许ldquo中途离队rdquoldquo先入先出rdquo

队列 (Queue) 是限定所有的插入只能在表的一端进行而所有的删除都在表的另一端进行的线性表

表中允许插入的一端称为队尾 (Rear) 允许删除的一端称为队头 (Front)

队列的操作是按先进先出的原则进行的

队列的物理存储可以用顺序存储结构也可以用链式存储结构

a 1 a 2 a 3 copyumlcopyuml a n 入队列出队列

头 尾

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

队列的运算 通常对队列进行的运算有设置一个空队列判定某个队列是否是空队

列插入一个新的队尾元素简称入队列删除队头元素简称出队列以及读取队头元素等

1048698如果进入队列的元素个数事先可以估计得到则队列可以按顺序存储方式进行组织当队列的容量无法预先估计时可以采用右图所示的链表存储结构

1048698ldquo假溢出rdquo问题若采取每插入一个元素队尾指针变量 R 的值加1 每删除一个元素队头指示变量 F 的值加 1 的方法则经过若干次插入删除运算后尽管队列中的元素个数小于存储空间的容量但由于此时 R 可能已指向存储空间的末端而无法再进行插入了所以在实现插入删除运算时一般使用循环队列即把队列的存储空间逻辑上看成一个环当 R 指向存储空间的末端后就把它重新置成指向存储空间的始端如下图所示

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

进队操作与出队操作结果示意图

显然若队空间为 N个元素则进行 N次进队操作后就会出现队满现象而不论这中间是否进行过出队操作即出队操作所腾出的空位不能重复利用这是一个十分严重的问题若不解决无论分配多大的空间也不能保证不发生溢出所以这种队列无实用价值解决这问题的方法是在发生假溢出时移动队中元素在尾部让出空位但这种方法效率差一种更好的方法是使用循环结构这就是所谓循环队列法

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

循环队列 将队列存储空间的最后一个位置绕到第一个位置形成逻辑上的

环状空间供队列循环使用采用循环队列结构后有效地解决了ldquo假溢出rdquo的问题避免了数据元素的移动

插入一个新元素rear = mod(rearm)+1

删除一个元素front = mod(frontm)+1

front = rear 队列空或满增加一个标志变量 S

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

front = rear 队列空或满增加一个标志变量 S

假设标志为 S 其状态定义为

设初始状态 F=R S= 0

插入一个元素后置 S= 1

插入操作

If ( F = R ) and ( S = 1 ) Then ERROR (ldquo队满rdquo ) ReturnElse R = mod ( Rm ) + 1 Q(R) = x S = 1Endif

删除操作

If S = 0 Then ERROR (ldquo队空rdquo ) ReturnElse F =mod ( Fm ) + 1 If F = R Then S = 0Endif

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

323 树和二叉树

树型结构是一类重要的非线性数据结构在此类结构中元素之间存在着明显的分层或嵌套关系它们通常以各种形式的链表作存储结构树和二叉树是最常用的树型结构

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

1树和二叉树的定义和术语 树结构类似一棵倒长的树结构中含有一个类似ldquo树根rdquo

的结点和若干类似ldquo树叶rdquo的结点以及若干分支节点

树的形式化定义 树 (Tree) 是由一个或多个结点组成的有限集合 T 其中有一个特定的称为根的结点 其余结点可分为m(mge0) 个互不相交的有限集 T1T2T3

hellipTm

每一个集合本身又是一棵树且称为根的子树

A

A

FE

DCB

JH IG

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

树的表示每进一层次加一个括号同层之间用逗号分开例如 (A(B(EF)C(G)D(HIJ))) 表示下面的树

一个节点的子树个数称为该节点的度( degree )树中各节点的度的最大值被定义为该树的度

A

A

FE

DCB

JH IG

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

父结点子结点边

兄弟

祖先子孙

路径路径长度

结点的层数树的层数

树叶分支节点

A

A

FE

DCB

JH IG

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

二叉树是另一种重要的树形结构其结构定义为二叉树(Binary Tree) 是 n(nge0) 个结点的有限集它或为空树(n=0) 或由一个根结点和两棵分别称为根的左子树和右子树的互不相交的二叉树组成

A

G

D

CB

IH

E F

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

树和二叉树之间最主要的差别是二叉树的结点的子树要区分左子树和右子树即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树

A

G

D

CB

IH

E F

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

二叉树的特性 包含 n个 (ngt0)元素的二叉树边数为 n-1

若二叉树的高度为 h(hgt=0) 则该二叉树最少有 h 个元素最多有 2h-1 个元素

包含 n 个元素 的二叉树的最大高度为 n 最小为

[log2(n+1)]

满二叉树

完全二叉树

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

2 树的存储结构 树的存储结构可以采用具有多个指针域的多重链表结点中指针域的

个数应由树的度来决定

但在实际应用中这种存储结构并不方便一般将树转化为二叉树表示进行处理

A

A

FE

DCB

JH IG

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

2 二叉树的存储结构 通常使用具有 2 个指针域的链表 LC为左指针域指向

结点的左子树 RC为右指针域指向结点的右子树

亦可用数组的下标来模拟指针即开辟三个一维数组DATA LC和 RC 分别存放结点的元素及其左右指针

LC DATA RC

root

(a)

(b)

A

B C

D E

G

F

H I

ABCD

DATA

EFGHI

2400

LC

78000

3560

RC

09000

1root

123456789

123456789

(c)

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

完全二叉树可以很方便地用数组来存储

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

树的二叉树表示方法 树的二叉树表示

在树 ( 树林 )与二叉树之间有一个自然的一一对应的关系每一棵都能唯一地转换到它所对应的二叉树

有一个自然的方式把树和树林转换成对应的二叉树凡是兄弟就用线连接起来对每个非终端结点除其最左孩子外删去该结点与其他孩子结点的连线再以根结点为轴心顺时针旋转 45度

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

5 树和二叉树的遍历 对于树形结构的运算很多但最重要使用最为广泛的是遍历遍历一个树形结构就是按一定的次序系统地访问该结构中的所有结点使每个结点恰被访问一次我们将重点讨论二叉树的遍历

树的遍历 根据树的递归定义有两种遍历树的方法 先根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先访问树的根结点然后依次先根遍历每棵子树

后根 ( 次序 )遍历若树中只有一个根结点则访问树的根结点否则首先依次后根遍历每一棵子树然后访问树的根结点

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

二叉树的遍历 分析二叉树的结构特性可知一棵非空的二叉树是由根结点左子树右子树三个基本部分组成则遍历二叉树只要依次遍历这三部分即可使用自然语言描述的遍历二叉树的算法如下

前序遍历二叉树算法( DLR )若二叉树不空则依次进行下列操作

a) 访问根结点 b) 前序遍历左子树 c) 前序遍历右子树

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

中序遍历二叉树的算法( LDR )为若二叉树不空则依次进行下列操作 a) 中序遍历左子树 b) 访问根结点 c) 中序遍历右子树

后序遍历二叉树的算法( LRD )为若二叉树不空则依次进行下列操作 a) 后序遍历左子树 b) 后序遍历右子树 c) 访问根结点

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

对于右图使用前序遍历则处理顺序为 ABEFCGDHIJ

对于右图使用中序遍历则处理顺序为 EFBGCHIJDA

对于右图使用后序遍历则处理顺序为 FEGJIHDCBA

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

+

-

a b c d

+

+

+

a b

c

d

+

+

- +

a b c ax y

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

35 图 图( graphic )也是一类重要的非线性结构它比线性表

和树形结构更复杂更一般前面讨论的线性表和树都可以看成是简单的图

图在计算机应用中十分广泛电子线路分析系统工程最优化统计力学化学成分分析遗传学控制学经济学社会学都用图作为分析研究计算的工具事实上ldquo数据结构rdquo就是从研究图在计算机上的表示和运算才发展起来的

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

在线性表中每个数据元素只有一个 (直接的 )前驱和后继即各数据元素之间仅有线性关系在树形结构中数据元素之间有明显的层次关系每一层中的数据元素只和上一层中的一个元素 (即父结点 )相关而在图中任意两个数据元素之间均可能相关

线性表 一对一

树 一对多

图 多对多

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

图的概念和术语

习惯上常用 G=(VE)代表一个图

结点又称为顶点 V 是结点的有穷集合 ( 非空 )

相关的结点偶对称为边 ( 或弧 ) E 是边的有穷集合 (E 可为空集对应的图中只有顶点没有边 )

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

图中代表一条边的结点偶对如果是无序的则称此图为无向图如图所示在无向图中 (V1 V2)和 (V2 V1) 这两个偶对代表的是同一条边

有向图是由顶点的非空有限集和边的有限集组成边是顶点的有序对 (V1 V2)和 (V2 V1) 表示的是不同的边若 (V1 V2) 表 示 有向图中的 一 条边 V1 称为边的 始点 V2 称为边的终点

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

n 个顶点的无向图边的最大数目是 n(n-1)2 n 个顶点的有向图边的最大数目为 n2 (不仅双环而且自环)

V1和 V2 是相邻结点边 (V1 V2)是 V1和 V2相关联的边一个结点的度是与该结点相关联的边的数目对于有向图则把以结点 Vi为终止的边的数目称结点 Vi 的入度把以 Vi为始点的边的数目称为 Vi 的出度出度为 0 的结点称为终端结点

在图 G=(VE)中若 (Vp Vi1)( Vi1 Vi2)helliphellip (Vin Vg) 都在 E中则称结点序列 Vp Vi1 Vi2helliphellip Vin Vg为从结点 Vp 到结点 Vg 的一条路径路径的长度定义为路径上边的数目

简单路径 顶点不相同的路径称为简单路径

起点和终点相同的路径为回路顶点不相同的回路为简单回路

连通图 无向图任意不同两点都有路径则该无向图为连通图

强连通图 有向图任意不同两点有路径反之亦然

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

图的存储方法图的结构复杂应用广泛因此其存储表示方法也多种多样下面给出两种最常用的存储表示方法

相邻矩阵表示法

邻接表表示法

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

图的相邻矩阵表示法 相邻矩阵是表示结点间的相邻关系的矩阵若 G 是一个具有 n 个结点的图则 G 的相邻矩阵是如下定义的 ntimesn 矩阵

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

用邻接表法表示无向图每条边在它的两个端点的边表里各占一个表目因此若每个表目占用一个单元则存储n 个结点m 条边的无向图需 n+2m 个单元

ndash用邻接表法表示有向图根据需要可以保存每个结点的出边表 (即以该结点为始点的边的表 ) 也可以保存每个结点的入边表 (即以该结点为终端的边的表 ) 有向图只保存入边或出边表之一则需要 m+n 个单元

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

图的遍历 深度优先遍历

基本思想是从图中某个 V 出发访问此结点再依次访问所有与 V 有路径的结点完成后再另选图中一个未被访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

广度优先遍历 基本思想是从某个结点 V 出发访问此结点再依次访问

V邻接的未访问结点再从这些结点出发进行广度优先遍历直至图中所有被访问过的结点的相邻结点都被访问到完成后另选图中一个未曾访问的结点作始点重复上述过程直至图中所有结点都被访问到为止

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

1-2-4-8-5-6-3-7

1-2-3-4-5-6-7-8

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

33 查找和排序

查找和排序是计算机最频繁的操作因此是需要掌握的基本技术

查找和排序是密切相关的 可以先排序再查找 可以通过查找进行排序

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

331 查找

在给定的数据集中找到满足要求的数据

简单数据集合mdashmdash遍历和枚举

结构式数据集合mdashmdash对键进行遍历和枚举 键是能惟一标识数据元素的数据项 如学号身份证号产品标识号网卡标识号等 反例姓名性别

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

以查找的方式(顺序和非顺序)和被查数据的有序或无序可以分为 4 种查找

顺序查找无序的数据 枚举(穷举)

顺序查找有序数据(访问顺序文件磁带文件)

非顺序查找有序数据 典型算法二分法

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

二分法算法Func BinSeek(A Min Max Key) Integer lsquoA 是待查数组

Dim Q Integer lsquoMin 是下界 Max 是上界While Min = Max Do

M = Int((Min + Max)2)If A(M) = Key Then

Return Q = M lsquo找到Else

If A(M) gt Key ThenMax = M

ElseMin = M

EndIfEndIfQ = BinSeek( A Min Max Key ) 递归

EndDoReturn 0

EndFunc

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

非顺序查找无序数据 记住怎样放入怎样取出关键在于怎么记 典型算法 Hash 法 Hash 法基本思想建立键值和其存储地址之间的联系

A = H(Key) 需要根据不同类型的数据(键值的特点和数据量)选择相应的

Hash函数 例 已知有 1000 个词 Key 值为 4位数采用平方取中的

Hash函数将这 1000 个词按照 Hash 值存储在数组中查找时根据 Key 值算出 H(Key) 即在数组中的位置

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

332 排序

插入排序

起泡排序

选择排序

快速排序

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

插入排序的基本思想

每步将一个待排序的记录按关键码值的大小插入到前面已排序的适当位置上直到全部插完止

例 (524613)

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

插入排序

Sub Insort(A N)

For i = 2 To N Do

Temp = A(i)

将 A(i)插入到已经排序的序列 A(1i-1)

j = i - 1

While j gt 0 And Temp lt A(j) Do

A(j+1) = A(j)

j = j - 1

End Do

A(j+1) = Temp

Next i

End Sub

在前面已排好序的序列中寻找合适位置的查找算法可以采用二分法加以改进

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

起泡排序 将待排序的记录按从后向前的顺序顺次两两比较若为逆序则进行交换将序列照此方法从头到尾处理一遍称作一趟起泡一趟起泡的效果是将关键码值最小的记录交换到了最前位置即该记录的顺序起始位置若某一趟起泡过程中没有任何交换发生则排序过程结束

Sub BubbleSort(AN) Flag = True i = 2 While i lt= N And Flag Do Flag = False For j = N To i Step -1 Do If A(j) lt A(j-1) Then Swap(A(j) A(j+1)) Flag = True End If Next j i = i + 1 End DoEnd Sub

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

选择排序 算法思想是找出某一元素将其余数据元素中的最小元素选

出与它交换直到换完

Sub SelectSort(A N) For i = 1 To N-1 Do p = i For j = i+1 To N Do If A(j) lt A(p) Then p = j End If Next j If p = i Then Swap(A(p)A(i)) End If Next iEnd Sub

插入排序起泡排序和选择排序的算法复杂度都是 O(N2)

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

快速排序 快速排序的基本方法是在待排序列中任取一个记录以它为基准用交换的方法将所有记录分成两部分关键码值比它小的在一部分关键码值比它大的在另一部分再分别对这两部分实施上述过程一直重复到排序完成快速排序法的平均执行时间为 log2n 量级

QUICKSORT(A p r) if p lt r then q = PARTITION(A p r) QUICKSORT(A p q - 1) QUICKSORT(A q + 1 r)

PARTITION(A p r)1 x = A[r]2 i = p - 13 for j = p to r - 14 do if A[j] le x5 then i = i + 16 exchange A[i] harr A[j]7 exchange A[i + 1] harr A[r]8 return i + 1

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

1 If p le k le i then A[k] le x

2 If i + 1 le k le j - 1 then A[k] gt x

3 If k = r then A[k] = x

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

二叉树的练习

P121 第 10 题 已知某二叉树的前序遍历序 列为

ABDEGCFHIJ 中序遍历序列为 DBGEAHFIJC 写出该二叉树后序遍历的序列

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

应用 最大花费与最小花费问题

问题某汽水制造厂( V1 )向市场( V4 )送货求走哪条路花费最少为送回空瓶的汽车最多支付多少费用

分析抽象为加权有向图求图从 V1到 V4 的最小和最大花费路径

最自然的解法穷举mdashmdash搜索所有路径计算权值比较最大最小

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

图的遍历有两种广度优先和深度优先我们采用深度优先

数据结构的设计 加权图的表示邻接矩阵和权矩阵

路径用堆栈表示一维堆栈表示路径同步的二维堆栈表示相邻节点

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

V1 V2 V4 V5 Nil

V2 V1 V3 V4 Nil

V3 V2 V4 V5 Nil

V4 V1 V2 V3 V5

V5 V1 V3 V4 Nil

1 2 5

2 3 3

3 4 8

4 5 6

5 1 4

2 4 10

1 4 16

3 5 7

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

1 2 4 5 Nil

2 1 3 4 Nil

3 2 4 5 Nil

4 1 2 3 5

5 1 3 4 Nil

图的邻接矩阵表示

路径栈

顶点栈

1 2 4

3

5p

1 4

V1

V2

V3 V4

V5

3

5 4

6

8

10

16

7

2 4 5

1 43

1 2 3 4

2 4 5

1 2 3 5 1 4

1 2 3 5 4

1 2 4

1 4

1 3 4

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

分酒问题 一个酒瓶盛满 8 斤酒量器只有 5

斤和 3 斤两个求如何把酒对分成两个 4斤的步骤要求最少的步骤

分析采用状态描述方法各瓶中的酒量为一状态状态通过分酒的动作( 6 种)改变因此可以用图的方式描述节点表示状态边表示动作这样生成的图叫状态图 问题转化为在状态图中进行搜索

初始节点( 8 0 0 )最终节点为( 4 4 0 )

采用广度优先的搜索 图不完备在搜索过程中自动生

800

350

8-gt5

503

8-gt3

440

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

数据结构设计 采用队列记录状态图中状态的生成过程 需要记录状态生成动作和状态之间的关系 4 种要素用 2 个队

列记录状态 2 个栈记录动作和动作之间的联系 计算过程

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

8-gt5 8-gt3 5-gt8 5-gt3 3-gt8 3-gt5

1 2 3 4 5 6

动作映射表

800

350

8-gt5

503

8-gt3

440

动作 8队列 5队列 链接

TopRear

Front

08 00

1

1

2

3

4

5

6

7

8

9

10

11

3 5 1

2 5 0 1

4 3 2 2

2 0 5 2

6 5 3 3

5 6 2 4

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

5 4 4 13

6 7 1 12

4 1 4 11

3 7 0 10

1 1 5 9

6 2 5 8

4 6 0 7

2 2 3 6

5 6 2 4

6 5 3 3

2 0 5 2

4 3 2 2

2 5 0 1

1 3 5 1

0 8 0 0

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

思考题

如何找出分酒问题中所有可能的步骤

如何解决农夫过河问题 一个农夫带着一只狼一只羊和一棵白菜身处河南岸要

把东西全部运到北岸约束条件是只有一条能容下他和一件物品的小船只有农夫能撑船不能单独留下羊和白菜也不能单独留下羊和狼狼不爱吃白菜

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34

计算机软件技术基础

八数码问题呢 1 3

7 2 4

6 8 5

1 2 3

8 4

7 6 5

  • Slide 6
  • Slide 7
  • Slide 9
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 20
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 31
  • Slide 34