14 图的基础知识-几种常用的存储结构

本文详细介绍了图数据结构的四种主要存储方式:邻接矩阵、邻接表、十字链表及邻接多重表的特点与应用场景,包括它们的空间复杂度、查询效率及优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间有点紧 没时间接着更了。。考完研回头再写吧

 


 

一、邻接矩阵
1、描述:用一维数组存储图顶点的信息
用二维数组存储图边的信息
2、特点:
①无向图的邻接矩阵:
 是唯一的对称矩阵,可以压缩存储(仅存储上/下三角);
 第i行(列)非零元素为第i个顶点的度
②有向图的邻接矩阵:
 第i行(列)的非零元素为第i个顶点的出度(入度);
③邻接矩阵的局限性:要确定多少边必须按行列检测,花费时间的代价很大。
④用于确定两点之间是否有边非常方便
⑤设图G邻接矩阵为A,A的n次方元素A^n[i][j]等于由顶点i~j长度为n的路径的数目
 适用:存储稠密图
 空间复杂度:O(n²);其中n为图顶点数|V|
3、存储结构定义

1 #define maxVertexnum 100
2 typedef struct{
3 int V[maxVertexnum];//顶点表
4 int edge[maxVertexnum][maxVertexnum];//边表
5 int vexnum,arcnum;//当前顶点数,弧数
6 }Mgraph;

 


二、邻接表
1、描述:对于图G中每个顶点建一个单链表(顶点表结点),第i个单链表中结点表示依附vi的边(边表结点)
2、特点:
①无向图需要的存储空间:O(|V|+2|E|)//无向图中每个边在表中出现2次
  有向图需要的存储空间:O(|V|+|E|)
②稀疏图用这个存储贼省空间!
③优:查一个点有几个关系边很方便
  缺:查入度需要遍历整个表(麻烦),判断两个顶边之间是否存在边效率低
④表示不唯一

3、存储结构定义:

 1 #define maxVertexnum 100
 2 /*边表结点*/
 3 typedef struct ArcNode{
 4 int adjvex; //表示弧指向的顶点位置
 5 struct ArcNode *next;//指向下一条弧的指针
 6 }ArcNode;
 7 /*顶点表结点*/
 8 typedef struct VNode{
 9 VertexType data; //顶点信息
10 ArcNode *first;//指向第一个依附该顶点的弧的指针
11 }VNode,AdjList[maxVertexnum];
12 /*临接表*/
13 typedef struct{
14 AdjList vertex; //邻接表
15 int vexnum,arcnum;//图的顶点数与弧数
16 }ALGraph

 



三、十字链表【针对有向图】
描述:一种链式存储的结构。
1、特点:
①每一条边用一个结点表示
②顶点之间是顺序存储
③很容易求顶点出度与入度
④表示不唯一,但唯一确定一个图
       
2、组成:
弧结点:尾域tailvex/头域headvex/链域hlink(指向弧头相同的下一条弧)/尾域tlink(指向弧尾相同的下一条弧)/数据域(data)

光描述有点抽象 上个图

3、存储结构定义

 1 #define maxVertexNum 100
 2 /*边表结点*/
 3 typedef struct ArcNode{
 4 int tailvex,headvex;//弧的头尾结点
 5 struct ArcNode *hlink,*tlink;//分别指向弧头弧尾相同的结点
 6 int data;
 7 }ArcNode;
 8 /*顶点表*/
 9 typedef struct VNode{
10 VertexType data;//顶点信息
11 ArcNode *firstin,*firstout;//指向第一条入弧和出弧
12 }VNode;
13 /*邻接表*/
14 typedef struct{
15 VNode xlist[maxVertexNum];//邻接表
16 int vexnum,arcnum;//记录图的顶点数与弧数
17 }GLGraph;

 



四、邻接多重表【针对无向图】


描述:为了解决邻接表判断两顶点之间是否存在边或者需要对边执行删除操作效率低的问题而诞生
      所有依附于同一顶点的边串联在同一链表中
1、特点:
①每条边只有一个结点
②每个边结点同时连接在两个链表中

二、组成:
边结点:
        mark(标识域,用于标记该边是否被搜索过。)
        ivex/jvex(该边依附的两顶点在图中的位置)
        ilink/jlink(指向下一条依附于顶点ivex/jvex的边)
        data/(数据域)

上个图

三、存储结构定义

 1 #define maxVertexNum 100
 2 /*边表结点*/
 3 typedef struct ArcNode{
 4 bool mark; //访问标记
 5 int ivex,jvex;//分别指向该弧的两个结点
 6 struct ArcNode *hlink,*tlink;//分别指向弧头弧尾相同的结点
 7 int data;
 8 }ArcNode;
 9 /*顶点表*/
10 typedef struct VNode{
11 VertexType data;//顶点信息
12 ArcNode *firstedge;//指向第一条依附该顶点的边
13 }VNode;
14 /*邻接表*/
15 typedef struct{
16 VNode adjmulist[maxVertexNum];//邻接表
17 int vexnum,arcnum;//记录图的顶点数与弧数
18 }AMLGraph;

 

转载于:https://www.cnblogs.com/AKsnoopy/p/7609152.html

<think>好的,用户现在问的是“什么是知识表示,有哪几种常用的知识表示方法”。我需要先理解用户的需求。可能用户在学习人工智能或者知识工程相关的课程,需要了解基本概念。之前用户问过如何编写猜数字游戏的Java程序,现在转向更理论的知识表示,可能是在学习AI的基础知识。 首先,知识表示的定义要准确。知识表示是人工智能中的核心概念,涉及如何将现实世界的信息转化为计算机可以处理的形式。需要简明扼要地解释,可能用户需要这个定义来理解后续的方法。 接下来是常用的知识表示方法。常见的包括逻辑表示法、产生式系统、语义网络、框架表示、本体论、状态空间和脚本表示。每个方法需要简要说明其特点和应用场景,帮助用户区分它们的不同用途。比如,逻辑表示法使用谓词逻辑,适合推理;产生式系统用于专家系统,像规则引擎;语义网络用表示关系,可能用于自然语言处理。 需要注意的是,用户可能希望了解每种方法的优缺点或典型应用,所以举例会有帮助。例如,产生式系统可以提到MYCIN专家系统,框架表示用于知识库系统,本体论在语义网中的应用。 另外,用户之前的问题是关于编程的,可能对实际应用更感兴趣,所以在介绍方法时强调实际应用场景会更符合他们的需求。例如,状态空间在路径规划中的应用,或者本体论在Web中的使用。 还要检查是否有遗漏的方法,比如可能还有面向对象表示、贝叶斯网络等,但考虑到常用性,可能需要优先列出最普遍的几种。确保分类清晰,每个方法单独一点,结构明确。 最后,总结部分要强调知识表示的作用和选择依据,帮助用户理解如何根据需求选择合适的方法。可能用户需要这个信息来完成作业或项目,所以总结要实用。 需要避免使用过于专业的术语,保持解释的易懂性。同时,保持回答的结构清晰,分点列出,符合用户之前要求的“结构清晰,帮助用户逐步解决问题”。</think>--- ### 知识表示的定义 **知识表示**(Knowledge Representation)是人工智能领域的核心技术之一,指通过某种形式化方法将现实世界的知识转化为计算机可存储、处理和推理的结构。其目的是使机器能够像人类一样理解、运用知识解决问题。 --- ### 常用知识表示方法 #### 1. **逻辑表示法** - **核心**:使用形式逻辑(如命题逻辑、一阶谓词逻辑)表达知识。 - **特点**: - 通过谓词、变量和逻辑运算符(如 $\land$, $\lor$, $\neg$)描述事实和规则。 - 支持自动推理(如归结推理)。 - **应用**:定理证明、专家系统中的规则推理。 - **示例**: $$ \forall x \, (\text{Human}(x) \rightarrow \text{Mortal}(x)) $$ 表示“所有人都是会死的”。 --- #### 2. **产生式系统(规则表示法)** - **核心**:基于“条件-动作”(IF-THEN)规则。 - **特点**: - 规则形如:`IF 条件 THEN 结论`。 - 适用于动态决策场景(如专家系统)。 - **应用**:医疗诊断系统、工业控制。 - **示例**: ``` IF 温度 > 38℃ AND 咳嗽 THEN 可能为流感 ``` --- #### 3. **语义网络** - **核心**:用节点和边构成的表示知识。 - **特点**: - 节点表示实体或概念,边表示关系(如“是子类”“拥有”)。 - 直观反映对象间的关联。 - **应用**:自然语言处理、知识谱。 - **示例**: ``` 猫 --继承--> 动物 猫 ----> 尾巴 ``` --- #### 4. **框架表示法** - **核心**:通过“框架”(Frame)结构化描述对象的属性和行为。 - **特点**: - 每个框架包含槽(属性)和侧面(约束条件)。 - 支持继承和默认值。 - **应用**:对象建模、知识库系统。 - **示例**: ``` [框架名: 汽车] 颜色: 默认=白色 品牌: 必填 价格: 范围(10,000~1,000,000) ``` --- #### 5. **本体论(Ontology)** - **核心**:通过分类、属性和关系定义领域知识体系。 - **特点**: - 标准化术语和概念层次(如“动物-哺乳动物-狗”)。 -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值