[Algorithm][BFS][拓扑排序][课程表][课程表Ⅱ][火星词典] + BFS解决拓扑排序原理 详细讲解

目录

  • 0.原理讲解
    • 1.有向无环图
    • 2.AOV网
    • 3.拓扑排序
    • 4.实现拓扑排序
    • 5.如何建图?
  • 1.课程表
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.课程表 II
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.火星词典
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


0.原理讲解

1.有向无环图

  • 有向无环图:DAG -> Directed Acyclic Graph

    • 入度:有多少条边指向它
    • 出度:有多少条从它出去
      请添加图片描述
  • 有向有环图

    • 结点4 5 6构成回路
      请添加图片描述

2.AOV网

  • 顶点活动图:AOV网 -> Activity on Vextex Network
    • :在有向无环图中,用顶点来表示一个活动,用来表示活动的先后顺序的图结构
    • :下图为做菜的流程图
      请添加图片描述

3.拓扑排序

  • 形象地说:找到做事情的先后顺序

  • 注意:拓扑排序的结果可能不是唯一的

  • 上图做菜的流程图中,可能会有下面两种排序结果

    准备厨具
    腌肉
    炒菜
    装盘
    干饭
    买菜
    洗菜
    切菜
    准备厨具
    腌肉
    炒菜
    装盘
    干饭
    买菜
    洗菜
    切菜
  • 如何排序?

    • 找出图中入度为0的点,然后输出
    • 删除与该点连接的边
    • 重复上述两步操作,直到图中没有点或者没有入度为0的点为止
  • 为什么判断条件是没有点 || 没有入度为0的点

    • 因为图中可能有环,是没办法到达没有点这个情况的
  • 拓扑排序重要应用:判断有向图中是否有环

4.实现拓扑排序

  • 借助队列,来一次BFS即可
  • 流程
    • 初始化:把所有入度为0的点加入到队列中
    • 当队列不为空的时候
      • 拿出队头元素,加入到最终结果中
      • 删除与该元素相连的边
      • 判断:与删除边相连的点,是否入度变成0
        • 如果入度为0,加入到队列中

5.如何建图?

  • 看稠密(数据量)选择合适的存储结构
    • 邻接矩阵
    • 邻接表
  • 邻接表除了用哈希桶存储外,也可以用以下容器抽象出来
    • vector<vector<int>> edges
      • 每个vector表示每个结点,vector里面的内容是其出度表
    • unordered_map<int, vector<int>> edges
      • int -> vector<int> == 当前结点 -> 出度表
      • 此处的元素类型是弹性的,此处的例子为int,若有需要string等其他类型也可以
    • unordered_map<char, unordered_set<char>> edges
    • 总结:根据具体元素,具体场景,灵活的使用容器即可
  • 根据算法流程,灵活建图
    • 每个结点的入度?
      • vector<int> in
      • 下标为对应结点,内容为对应入度
    • 每个结点的出度?
      • vector<int> out
      • 下标为对应结点,内容为对应出度
    • ……

1.课程表

1.题目链接

  • 课程表

2.算法原理详解

  • 本题问题可以转化为:
    • 能否拓扑排序?
    • 是否是有向无环图?/ 有向图中是否有环?
  • 本题建图实现unordered_map<int, vector<int>> edges

3.代码实现

bool CanFinish(int n, vector<vector<int>>& prerequisites) 
{unordered_map<int, vector<int>> edges; // 邻接表vector<int> in(n); // 存储每一个结点的入度// 1.建图for(auto& e : prerequisites){int a = e[0], b = e[1]; // b -> aedges[b].push_back(a); // 构建图的逻辑结构in[a]++; // 入度表}// 2.拓扑排序BFS// (1) 把所有入度为0的结点加入队列queue<int> q;for(int i = 0; i < n; i++){if(in[i] == 0){q.push(i);}}// (2) BFSwhile(q.size()){int tmp = q.front();q.pop();// 修改相连结点的边for(auto& e : edges[tmp]){in[e]--;if(in[e] == 0){q.push(e);}}}// 3.判断是否有环for(auto& e : in){if(e){return false;}}return true;
}

2.课程表 II

1.题目链接

  • 课程表 II

2.算法原理详解

  • 本题问题可以转化为:
    • 能否拓扑排序?
    • 是否是有向无环图?/ 有向图中是否有环?
  • 本题建图实现vector<vector<int>> edges

3.代码实现

vector<int> findOrder(int n, vector<vector<int>>& prerequisites) 
{vector<vector<int>> edges(n);vector<int> in(n);// 1.建图for(auto& v : prerequisites){int a = v[0], b = v[1]; // b -> aedges[b].push_back(a);in[a]++;}// 2.拓扑排序vector<int> ret;queue<int> q;// (1) 将所有入度为0的点入队列for(int i = 0 ; i < n; i++){if(in[i] == 0){q.push(i);}}// (2) BFSwhile(q.size()){int tmp = q.front();q.pop();ret.push_back(tmp);// 修改相连结点的边for(auto& e : edges[tmp]){in[e]--;if(in[e] == 0){q.push(e);}}}// 判断结果并返回if(ret.size() == n){return ret;}else{return {};}
}

3.火星词典

1.题目链接

  • 火星词典

2.算法原理详解

  • 本题问题可以转化为:
    • 能否拓扑排序?
    • 是否是有向无环图?/ 有向图中是否有环?
  • 如何搜索信息?
    • 两层for循环枚举出所有的两个字符串的组合
    • 利用双指针,根据字典序规则找出信息
  • 流程
    • 建图unordered_map<char, unordered_set<char>> edges
    • 统计入度信息unordered_map<char, int> in
      • 此哈希表必须要初始化,否则入度表里没有任何字符的信息,BFS时,无法将入度为0的结点入队列
    • 拓扑排序
  • 细节问题:类似abcab这两个字符串
    • 不管在哪儿,都应该是ab的字典序小于abc的字典序

3.代码实现

class Solution 
{unordered_map<char, unordered_set<char>> edges; // 邻接表unordered_map<char, int> in; // 入度表bool check = false; // 处理边界情况
public:string alienOrder(vector<string>& words) {// 1.初始化入度表for(auto& str : words){for(auto& ch : str){in[ch] = 0;}}// 2.枚举搜集字典信息 + 建图int n = words.size();for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){AddInfo(words[i], words[j]);if(check){return "";}}}// 3. 拓扑排序string ret;queue<char> q;// (1) 入度为0的入队列for(auto& [ch, count] : in){if(count == 0){q.push(ch);}}// BFSwhile(q.size()){char tmp = q.front();q.pop();ret += tmp;// 修改相邻点的边for(auto& ch : edges[tmp]){if(--in[ch] == 0){q.push(ch);}}}// 检验是否有环for(auto& [ch, count] : in){if(count != 0){return "";}}return ret;}void AddInfo(const string& s1, const string& s2){int n = min(s1.size(), s2.size());int i = 0;while(i < n){if(s1[i] != s2[i]) {char a = s1[i], b = s2[i];// 避免数据冗余if(!edges.count(a) || !edges[a].count(b)){edges[a].insert(b);  // s1[i] -> s2[i]in[b]++;}break;}i++;}// 边界情况处理if(i == s2.size() && i < s1.size()){check = true;}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Django图像识别系统毕业设计(付源码)

前言&#xff1a;Django是一个由Python编写的具有完整架站能力的开源Web框架&#xff0c;Django本身基于MVC模型&#xff0c;即Model&#xff08;模型&#xff09;View&#xff08;视图&#xff09; Controller&#xff08;控制器&#xff09;设计模式&#xff0c;因此天然具有…

AR技术的那些事

什么是AR技术&#xff1f; AR技术&#xff0c;全称为增强现实技术&#xff08;Augmented Reality&#xff09;&#xff0c;是一种将虚拟信息叠加到现实世界中的技术。通过AR技术&#xff0c;用户可以通过手机、平板电脑、AR眼镜等设备&#xff0c;将虚拟的数字内容&#xff08;…

【抽样调查】分层抽样上

碎碎念&#xff1a;在大一大二时听课有的时候会发现听不太懂&#xff0c;那时候只觉得是我自己的基础不好的原因&#xff0c;但现在我发现“听不懂”是能够针对性解决的。比如抽样调查这门课&#xff0c;分析过后我发现我听不懂的原因之一是“没有框架”&#xff0c;一大堆知识…

【使用ChatGPT的API之前】OpenAI API提供的可用模型

文章目录 一. ChatGPT基本概念二. OpenAI API提供的可用模型1. InstructGPT2. ChatGPT3. GPT-4 三. 在OpenAI Playground中使用GPT模型-ing 在使用GPT-4和ChatGPT的API集成到Python应用程序之前&#xff0c;我们先了解ChatGPT的基本概念&#xff0c;与OpenAI API提供的可用模型…

情感分类学习笔记(1)

文本情感分类&#xff08;二&#xff09;&#xff1a;深度学习模型 - 科学空间|Scientific Spaces 一、代码理解 cw lambda x: list(jieba.cut(x)) #定义分词函数 您给出的代码定义了一个使用 jieba 分词库的分词函数。jieba 是一个用于中文分词的 Python 库。该函数 cw 是…

03_led_horse_run_v0 跑马灯

03_led_horse_run_v0 在Verilog中实现跑马灯通常涉及到使用一个计数器来控制LED灯的亮灭顺序。 跑马灯是一种常见的电子显示方式&#xff0c;它通过控制多个LED灯的顺序点亮&#xff0c;形成一种动态的视觉效果&#xff0c;看起来就像灯在“跑”一样。 知识点&#xff1a; 移…

FTTR介绍

概念 FTTR&#xff08;Fiber to The Room&#xff09;是一种新型的光纤接入技术&#xff0c;它将光纤信号传输到室内的一个通信网络方案。在FTTR网络中&#xff0c;光纤到达建筑物内的分配盒后&#xff0c;通过铜缆或其他传输介质进入室内各个房间&#xff0c;为用户提供网络服…

Java面试八股文(SpringCloud篇)

****************************************************

前端双语实现方案(VUE版)

一、封装一个lib包 结构如下 en.js use strict;exports.__esModule true; exports.default {sp: {input: {amountError: Incorrect amount format},table: {total: Total:,selected: Selected:,tableNoData: No data,tableNoDataSubtext: Tip: Suggest to recheck your fil…

springboot利用Redis的Geo数据类型,获取附近店铺的坐标位置和距离列表

文章目录 GEO介绍GEO命令行应用添加地理坐标位置获取指定单位半径的全部地理位置列表springboot 的实际应用 GEO介绍 在Redis 3.2版本中&#xff0c;新增了一种数据类型&#xff1a;GEO&#xff0c;它主要用于存储地理位置信息&#xff0c;并对存储的信息进行操作。 GEO实际上…

整理好了!2024年最常见 100 道 Java基础面试题(三十七)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 100 道 Java基础面试题&#xff08;三十六&#xff09;-CSDN博客 七十三、抽象类是否可以继承具体类&#xff1f; 在Java中&#xff0c;抽象类&#xff08;abstract class&#xff09;可以继承自具体类&#xff08;c…

Unity延时触发的几种常规方法

目录 1、使用协程Coroutine2、使用Invoke、InvokeRepeating函数3、使用Time.time4、使用Time.deltaTime5、使用DOTween。6、使用Vision Timer。 1、使用协程Coroutine public class Test : MonoBehaviour {// Start is called before the first frame updatevoid Start(){ …

使用css的box-reflect属性制作倒影效果

box-reflect 是一个在 CSS 中创建元素倒影效果的非标准属性。尽管它在过去的一些 WebKit 浏览器中&#xff08;如旧版的 Safari 和 Chrome&#xff09;得到了支持&#xff0c;但由于它并未成为 CSS 标准的一部分&#xff0c;因此在现代浏览器中的兼容性较差。以下是对 box-refl…

瑞麦德机电设备有限公司将莅临2024第13届生物发酵展

参展企业介绍 河南瑞麦德机电设备有限公司是专业从事机械输送气力输送、称重配料、筛分、磁选设备研发和制造于一体的企业&#xff0c;公司采用国内外同行业产品的先进技术&#xff0c;经专业团队设计、研发、生产&#xff0c;产品满足“ISO9001”&#xff0c;“GMP”等标准要求…

Java开发原则

Java开发原则 一. 设计规范1.1 Vo设计原则1.1.1 Long类型需要转为String类型 1.2 Mapper接口命名1.2.1 新增1.2.2 删除1.2.3 更新1.2.4 查询 一. 设计规范 1.1 Vo设计原则 1.1.1 Long类型需要转为String类型 由于Long类型转递到前端会出现数据溢出 1.2 Mapper接口命名 1.2…

React 学习-3

Props state可变&#xff0c;props不可变&#xff0c;故子组件使用props较多 ar title "菜鸟教程"; // var title 123; var MyTitle React.createClass({propTypes: {title: React.PropTypes.string.isRequired,},render: function() {return <h1> {this.…

线程的ThreadLocal

ThreadLocal是Java语言中的一个线程内部存储类&#xff0c;可以用来在多线程环境下保证每个线程都拥有自己独立的变量副本&#xff0c;避免了多线程间的数据共享问题。 ThreadLocal的使用方式非常简单&#xff0c;只需要创建一个ThreadLocal对象&#xff0c;然后使用它的get()…

【BST】Behavior Sequence Transformer for E-commerceRecommendation in Alibaba

一、提出背景 传统的Embedding&MLP模型结构将原始特征嵌入到低维向量中&#xff0c;然后将其concat后输入MLP进行最终推荐。DIN提出使用注意力机制来捕获候选项与用户先前点击的项之间的相似性。 然而&#xff0c;大多数这些工作只是连接不同的特征&#xff0c;而没有捕获用…

云动态摘要 2024-05-08

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

通过自适应提示提升大语言模型的零样本推理能力

随着大模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;它们在自然语言处理&#xff08;NLP&#xff09;任务上取得了前所未有的成就。特别是&#xff0c;LLMs展现出了强大的推理和规划能力&#xff0c;这得益于它们的少样本和零样本学习能力。然而&#xff0c;现有的方…