数据结构算法-图技术点

引言

胡图图:“我成为电脑砖家(人们都在我吧上评论电脑配置).,按理说我应该开一家图图计算机研究科技公司…”!
于小美:“没错,图图应该开一家公司 来扩展你的专业知识”
何壮壮:“厉害是厉害 ,要不要大哥来帮帮你(至于钱,好说:月薪2万)…”
图图:“你狮子大开口! ,那你还是当 你的音乐天才吧”!
壮壮:“还记得小时候,我胡说八道的建议,以及错误的引导 ,结果:还不是你自己(找到原因),并且说出来”
图图:“别提了 ,说说你的打算吧 刷子”
帅子:“我打算设计裙子 ,把我最讨厌的东西,设计起来,”
刷子:“还记得我们的美好的时光,土豆”
图图:“当然,我们一起玩 一起恶作剧, 一起上小学(有可能) …”
小美:“对我 没有印象?”
图图:“让我难以忘怀的就是我的兄弟 小怪 多少日日夜夜陪着我 唉 小怪!”


一番争吵后,图图陷入了沉思,是时候 把我的爱琴 深深地埋在心里…
这番描述有可能图图长大成人后, 毕竟图图已经是22岁了 ,刷子23岁 没错 刷子比图图大 当然是大3个月,这回忆杀有谁不爱呢

顺这整套逻辑可以画出 图结构
在这里插入图片描述

或许这才是真正的朋友关系图在这里插入图片描述
这篇番外剧情打几分 在这里插入图片描述,通过这些了解图结构 恰到好处
本来想写我们家的坤坤,但发现坤坤太多ikun粉丝.
尤其是哔哩哔哩全是以绿尸寒警告ikun们最为恰到好处,真的老绝了"尤其是把坤坤画出中国风的作为真ikun",和对接小曲真的老绝了,这两位真ikun ,我还想写让子弹飞这个正在申遗的文化遗产历史片作品 创作题材简直过多 !

图的原理

通过以上的例子,应该了解了图的描述以及刷子与土豆的 友情(男主角和女主角的友谊之情)
小森:确定不是"爱情的情?" 在这里插入图片描述
来看看什么是图结构
图:由顶点(在这里插入图片描述)和边(在这里插入图片描述 )组合成的数据结构

  • 顶点(Vertex):包含数据的结构
  • 边(Edge):连接两个顶点的连接线(表示顶点的关系)

在这里插入图片描述
图图和小怪是兄弟关系,但只有图图知道小怪会说话 张帅子和图图是好哥们 并且知道小怪是图图的小猫 当然小怪的说话功能只有图图一个人知道,所以不存在小怪和张帅子的关系 可怜的小怪(就是不知道他俩搞起来暗恋) 痛! 太痛了呜呜

  • 权值:是指描述关系或者解释的数值
    比如说:我从广州到北京的飞机需要400元的机票 这个是的权值最有用的地方之一
    在这里插入图片描述

图的表示

有方向 和 无方向

有方向

在这里插入图片描述

有方向的往往都是有一定的关系存在
比如说:"胡图图和张帅子之间的甜言密语 "
当着图图的面说 我可不是因为喜欢你才给你的 "(第三季的满天都是小星星(下))
在这里插入图片描述

网友神级翻译:"我可是因为喜欢你才给你的 " 哎呦我去,嗑死我了
在这里插入图片描述

网友:看个动画片都在撒狗粮 呜呜
图图:**emmmm,我不知道刷子在说什么? 你再说一遍! **
他爸妈以及小怪都不知道;
这种情况也就有了无方向的

无方向

在这里插入图片描述
蔡徐坤(2019 NBA中国形象大使) 臭名昭著
一旦公之于众必然骂声一片 什么香精煎鱼 ,拿什么荔枝 食补食油饼 提供了一系列的食物 当然最重大的食物:鸡你太美
吃鸡族疯了似的 ,加上这份绿尸寒 你可真牛逼 立马就扒出来
"在偶像练习生打篮球的鸡哥 在哪里疯狂唱跳Rap 并且打起来坤式篮球 " 一场ikun大战即将打响 小黑子们想出来"香精煎鱼 ,拿什么荔枝 食补食油饼 "提供了一系列的食物 后 停止了攻击
当然这些ikun没有丢坤坤的脸 拿出二创作品 并且一个比一个牛逼,至于本作者我吗 当然是记录这些ikun们的,以及这些菜
我没有侮辱蔡徐坤本人吧 ! 你们统一在评论区讨论讨论
你们也看出来,我需要表示什么,这些就是某粉丝群体对蔡徐坤本人喜欢的程度(一本正经的胡说八道)在这里插入图片描述
某粉丝群体喜欢蔡徐坤的梗 ,并不是喜欢蔡徐坤 , 利用蔡徐坤的正面大新闻来调侃,引起了轰动B站用户( 大部分)
从恨变灵感大爆发 各种二创作品,真的老牛逼了,尤其是鬼畜区的 也给蔡徐坤一定的知名度 (希望入站必刷能出现我坤哥的鬼畜视频) 我说的这些就是对这个无向图的了解以及我是怎么描述它仅此而已
当然也可以从篮球队说起对于篮球队的话 中国篮球队Vs美国篮球队 (假设) 他们并没有关系 与国家有关系 其次是篮球 因为热爱篮球 在这里就体现出无向图

到此为止 我萌理解了有方向和无方向的图 接下来就是如何表示这些 图结构

图的存储方式

邻接矩阵

在这里插入图片描述

我们来看这张图 A到F 的 图结构
首先 我们看A 这个名号叫菠萝吹雪的 他有三个女人 分别为"菠萝小薇",“梨花诗”,“梨花诗(橙留香)”
B就是"菠萝小薇" 虽然非常不情愿,但自己还是喜欢上另外一个男人F
**C 是梨花诗(配音:橙留香的配音演员(陆双)) ** 原来泡自己的兄弟
“D是 梨花诗(如花)”
"E:好兄弟(橙留香)
所谓的F 小果叮

用 邻接矩阵 表示是这样子的
在这里插入图片描述
行 : A行 B行 C行 D行 E行 D行
列 : A列 B列 C列 D列 E列 D列

简化一下
A是喜羊羊 B是美羊羊 C是沸羊羊 大家应该:长大 看喜灰 发现大家都觉得 沸羊羊像舔狗 单独的片段:来自B站

好友表示:1
喜欢表示:2
舔狗表示:3
在这里插入图片描述
在这里插入图片描述
喜羊羊:
A行 A列 喜羊羊 自己
A行 B列 美羊羊 好友
A行 C列 沸羊羊 好友(以及好兄弟)

美羊羊:
B行 A列 喜羊羊 喜欢
B行 B列 美羊羊 自己
B行 C列 沸羊羊 舔狗

沸羊羊:
C行 A列 喜羊羊 好友(以及好兄弟)
A行 B列 美羊羊 喜欢
A行 C列 沸羊羊 自己

如何? 这个形象 (怎么感觉熊出没也有呢) 哈哈哈 当然熊出没那个真兄弟,

emmm 你们发现了 加入一个人会使得空间大了 3个人 九个空间 那加个人 岂不是扩大 加顶点 再3乘4? 还是4乘4 ? 这个空间大
很明显是4乘4
假设果宝特攻里有第五位cp 还得添加顶点 并且多出来顶点 (n*2) -1个顶点 因此通常不会用到邻接矩阵

空间和时间:复杂度为

V: (Vertex 顶点) 顶点数

操作 复杂度
存储空间 O(V^2)
添加顶点 O(V^2)
添加边 O(1)
访问 O(1)

邻接表

在这里插入图片描述

这图怎么感觉有点像哈希表?
但指向的是关联的数据
我来画个简单的 以刺客伍六七的一部分的角色 来进行描述吧 最近看的国产动漫.在这里插入图片描述
主角:伍六七原本是暗影刺客 ,遭遇某些事情被通缉了 结果被杀害 ,漂流到小鸡岛,被一只蓝羽鸡 名叫鸡太保,所救 因为他的救治使活过来了…
梅花十三:因为某些原因,阴差阳错的 与伍六七接吻 所以成了CP.当然他是暗影刺客的之一的徒弟 同样是敌人
鸡太保:一只备受压迫的蓝羽鸡,但肯反抗,亲眼见证自己的兄弟活活被打死,却不敢给小飞鸡知道真相. 后来一起来到小鸡岛…
小飞鸡:蓝羽鸡和白鸽的爱情结晶,他知道他的爸以去世 使得他强大起来 被鸡太保照顾着 使他有安全感 并且拥有男生羡慕的八块腹肌(当有人被欺负时变得)

可乐:一名斯坦国的基因实验品 同时也是异能者 异能属性:让对方无法动弹
何大春: 小鸡岛保镖 保护小鸡岛安全,但因为排斥来到小鸡岛 技能:情比金坚七天锁 金刚不坏童子身 金刚不坏大宝剑

可以看出都在反映社会 这些角色有亲情 友情 还有 爱情 因此可以说是青春期 包括成人 必追的动漫 在这里插入图片描述
邻接表
在这里可以看到弄了一个角色分析池
在这里插入图片描述

然后 依次添加关系
这是伍六七添加的关系
在这里插入图片描述
这是鸡太保添加的关系
在这里插入图片描述

这是小飞鸡添加的关系
在这里插入图片描述

这是梅花十三添加的关系
在这里插入图片描述

这是可乐添加的关系
在这里插入图片描述

这是何大春添加的关系
在这里插入图片描述
可以看出以下的关系数量
在这里插入图片描述

顶点
A 6
B 2
C 2
D 1
E 1
F 1

可以看出顶点 A到F顶点 ,边 的数量

邻接表是通过大规模的数量 顶点 与关系边 一个列表可以用不同的顶点链接成边
空间和时间:复杂度为
V: (Vertex 顶点) 顶点数 E(Edge) 边数

操作 复杂度
存储空间 O(V+E)
添加顶点 O(1)
添加边 O(1)
访问 O(V)

图的算法实现

先看 定义邻接表

//边
struct Edge {
   

    int AdjVertex;//邻接顶点
    int Weight;//权值

    Edge* next;//下一条边
};

using  VertexValue = use define

//顶点
struct Vertex {
   

   VertexValue value;  // 顶点数据
     Edge* First;//获取第一条边
};
//邻接顶点
using AdjVertex = Vertex*;
//邻接表
using AdjList = AdjVertex*;

//图
struct Graph {
   
  
    //邻接列表
    AdjList List;

    //顶点数
    int VertexSize;

    //边数
    int EdgeSize;
 };

看的清清楚楚 !

using AdjVertex = Vertex*;

你也可以不用指针 用 了也没啥事我的就是方法方式不一样
为了更好的构建图结构 画图是避免不了的事情
请看现露出只因(鸡)脚,本作者 带来的精彩图

在这里插入图片描述
首先来看圆圆的带着字 ! 蔡徐坤与其他人关系 是没有任何的关系
邻接表:包含数据 并且有一个 Edge* First; 获取第一条边 当然现在也显示不出来

来看看邻接表如何组合成图结构的吧

//图
struct Graph {
   
  
    //邻接列表
    AdjList List;

    //顶点数
    int VertexSize;

    //边数
    int EdgeSize;
 };
   //邻接列表
    AdjList List; //本质就是 一个指针数组 List指向蔡徐坤这个虚拟结点 当然你也可以认为是一个结点指向蔡徐坤这个结点

在这里插入图片描述

算法实现

算法声明

//图初始化
void GraphInit(Graph& graph);

//添加顶点
void AddVertex(Graph& graph, VertexValue value);

//添加边
void AddSingleEdge(Graph& graph, VertexValue VertexValueFirst, VertexValue VertexValueSecond);

//添加边的权值
void SetEdgeOFWeight(Graph& graph, VertexValue VertexValueFirst, VertexValue VertexValueSecond, Ikun Weight);

//深度优先遍历
void DepthFirstSearch(const Graph& graph);
void DepthFirstSearch(const Graph& graph, int VertexIndex);

//广度优先遍历
void BreadthFirstSearch(const Graph& graph);

初始化图结构

你需要多少个顶点 ?
看你的需求 定义常量
所以添加顶点的的时候 动态? 还是一次性分配好
当然 效率来说当然是还是一次性分配好 难道你想一个个扩展? 产生时间成本 有的时候一切的安排或许有效率 但也要学会变动态,比如说:突然忘记带笔记本电脑上班,赶紧回去找笔记本电脑 没有发生什么事情 .比如说 :遇见好久不见的朋友 聊一下什么的 我们需要理性的动态 而不是一边一次性安排计划 这个点我要干嘛 ;只会感觉没有意义 完全是计划绑定死了的人

所以一切看你的需求来 我的需求是 如果顶点数大于1024 那么不需要添加

//顶点添加最大值
const int MaxSize = 1024
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值