数据结构28-30

上一篇 / 下一篇  2010-07-04 21:08:30

第二十八课

本课主题:图的存储结构

教学目的:掌握图的二种存储表示方法

教学重点:图的数组表示及邻接表表示法

教学难点:邻接表表示法

授课内容:

一、数组表示法

用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系 (边或弧)的信息。

// 图的数组(邻接矩阵)存储表示

#define INFINITY INT_MAX //最大值无穷大

#define MAX_VERTEX_NUM 20 //最大顶点个数

typedef enum{DG,DN,AG,AN} GraphKind;//有向图,有向网,无向图,无向网

typedef struct ArcCell{

VRType adj; //VRType是顶点关系类型。对无权图,用1或0表示相邻否,对带权图,则为权值类型

InfoType *info; //该弧相关停息的指针

}ArcCell,AdjMatrix[max_vertex_num][max_vertex_num];

tpyedef struct{

VertexType vexs[MAX_VERTEX_NUM]; //顶点向量

AdjMatrix arcs; //邻接矩阵

int vexnum,arcnum; //图的当前顶点数和弧数

GraphKind kind; //图的种类标志

}MGraph;

二、邻接表

邻接表是图的一种链式存储结构。

在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)。每个结点由三个域组成,其中邻接点域 (adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点;数据域(info)存储和边或弧相关的信息,如权 值等。每个链表上附设一个表头结点,包含链域(firstarc)指向链表中第一个结点,还设有存储顶点vi的名或其它有关信息的数据域(data)。 如:

表结点

adjvex

nextarc

info

头结点

data

firstarc

#define MAX_VERTEX_NUM 20

typedef struct ArcNode{

int adjvex; //该弧所指向的顶点的位置

struct ArcNode *nextarc; //指向下一条弧的指针

InfoType *info; //该弧相关信息的指针

}ArcNode;

typedef struct VNode{

VertexType data; //顶点信息

ArcNode *firstarc; //指向第一条依附该顶点的弧的指针

}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct {

AdjList vertices; //图的当前顶点数和弧数

int vexnum,arcnum; //图的种类标志

int kind;

}ALGraph;

 

三、总结

图的存储包括哪些要素?

回目录上一课下一课

第二十九课

本课主题:静态查找表(一)顺序表的查找

教学目的:掌握查找的基本概念,顺序表查找的性能分析

教学重点:查找的基本概念

教学难点:顺序表查找的性能分析

授课内容:

一、查找的基本概念

 

查找表:

是由同一类型的数据元素(或记 录)构成的集合。

查找表的操作:

1、查询某个“特定的”数据元素是否 在查找表中。
2、检索某个“特定的”数据元素的各种属性。
3、在查找表中插入一个数据元素;
4、从查找表中刪去某个数据元素。

静态查找表

对查找表只作前两种操作

动态查找表

在查找过程中查找表元素集合动态改变

关键字

是数据元素(或记录)中某个数 据项的值

主 关键字

可以唯一的地标识一个记录

次关键字

用以识别若干记录

查找

根据给定的某个值,在查找表中确定一个其关键字等于给定的记录或 数据元素。若表中存在这样的一个记录,则称查找是成功的,此时查 找的结果为给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查 找不成功

一些约定:

典型的关键字类型说明:

typedef float KeyType;//实型
typedef int KeyType;//整型
typedef char *KeyType;//字符串型

数据元素类型定义为:

typedef struct{
KeyType key; // 关键字域
...
}ElemType;

对两个关键字的比较约定为如下的宏定义:

对数值型关键字
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))

对字符串型关键字
#define EQ(a,b) (!strcmp((a),(b)))
#define LT(a,b) (strcmp((a),(b))<0)
#define LQ(a,b) (strcmp((a),(b))<=0)

二、静态查找表

静态查找表的类型定义:

ADT StaticSearchTable{

数据对象D:D是具有相 同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标识数据元素的关键字。

数据关系R:数据元素同 属一个集合。

基本操作P:

Create(&ST,n);

操作结果:构造一个含n 个数据元素的静态查找表ST。

Destroy(&ST);

初始条件:静态查找表ST 存在。

操作结果:销毁表ST。

Search(ST,key);

初始条件:静态查找表ST 存在,key为和关键字类型相同的给定值。

操作结果:若ST中在在 其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。

Traverse(ST,Visit());

初始条件:静态查找表ST 存在,Visit是对元素操作的应用函数。

操作结果:按某种次序对ST 的每个元素调用函数visit()一次且仅一次。一旦visit()失败,则操作失败。

}ADT StaticSearchTable

三、顺序表的查找

静态查找表的顺序存储结构

typedef struct {

ElemType *elem;

int length;

}SSTable;

顺序查找:从表中最后一个记录开始,逐个进行记录的关键字和给定 值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,查找不成功。

int Search_Seq(SSTable ST,KeyType key){

ST.elme[0].key=key;

for(i=ST.length; !EQ(ST.elem[i].key,key); --i);

return i;

}

查找操作的性能分析:

查找算法中的基本操作是将记录的关键字和给定值进行比较,,通常 以“其关键字和给定值进行过比较的记录个数的平均值”作为衡量依据。

平均查找长度:

为确定记录在查找表中的位置,需用和给定值进行比较的关键字个数 的期望值称为查找算法在查找成功时的平均查找长度。

其中:Pi为查找表中第 i个记录的概率,且

Ci为找到表中其关键字与给定值相等 的第i个记录时,和给定值已进行过比较的关键字个数。

等概率条件下有:

假设查找成功与不成功的概率相同:

四、总结

什么是查找表

顺序表的查找过程

回目录上一课下一课

第三十课

本课主题:静态查找表(二)有序表的查找

教学目的:掌握有序表的折半查找法

教学重点:折半查找

教学难点:折半查找

授课内容:

一、折半查找的查找过程

以有序表表示静态查找表时,Search函数可用 折半查找来实现。

先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。

二、折半查找的查找实现

int Search_Bin(SSTable ST,KeyType key){

low=1;high=ST.length;

while(low<=high){

mid=(low+high)/2;

if EQ(key,ST.elem[mid].key) return mid;

else if LT(key,ST.elem[mid].key) high=mid -1;

else low=mid +1 ;

}

return 0;

}//Search_Bin;

三、折半查找的性能分析

折半查找在查找成功时和给定值进行比较的关键字个数至多为

回目录上一课下一课


TAG:

 

评分:0

我来说两句

日历

« 2024-04-25  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 19172
  • 日志数: 51
  • 建立时间: 2009-04-22
  • 更新时间: 2010-12-09

RSS订阅

Open Toolbar