[Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径
Given a directed graph, design an algorithm to find out whether there is a route between nodes.
这道题让我们判断给定的一个图的任意两个节点间是否有路径。首先我们要知道如何定义一个图, 一般最常用的两种表示图的方法是: Adjacency Matrix 和 Adjacency List。
对选择用哪种方法来表示图取决于你要做什么样的操作和使用的难易程度。下面稍微总结了一下这两种方法的优缺点:
Adjacency Matrix
优点:邻接矩阵容易表示并且是用的过程可以清楚的看到节点之间的关系。删除一条边需要O(1)时间复杂度,判断两个节点间是否有路径非常快,只需要O(1)时间复杂度。
缺点:空间复杂度比较大O(V^2). 即使是稀疏矩阵也需要同样的空间。如果增加一个节点需要O(V^2)的时间复杂度。
Adjacency List
1 class Node 2 attr_accessor :name, :neighbors 3 4 def initialize(name) 5 @name = name 6 @neighbors = [] 7 end 8 end 9 10 class Graph 11 attr_accessor :nodes 12 13 def initialize 14 @nodes = [] 15 end 16 end
优点:节省空间O(V+E). 增加一个节点很容易O(1)。
缺点:判断两个节点是否右边不是很快,需要O(V)的时间复杂度。
所以这道题在使用不同的图的表示方法的时候,判断两点间的路径方法是不一样的。我们假设使用Adjacency List的方法来表示图。
如何判断节点间是否有路径呢?这道题很简单,我们只需要使用DFS或者BFS来遍历整个图就可以了。
参见如下代码:
BFS Version
class Nodeattr_accessor :name, :neighbors, :visiteddef initialize(name)@name = name@neighbors = []@visited = falseend enddef has_route?(node1, node2)return false if node1.nil? || node2.nil?q = Queue.newnode1.visited = trueq << node1while !q.empty?cur = q.popreturn true if cur.name == node2.namecur.neighbors.each do |n|if !n.visitedn.visited = trueq << nendendendfalse end
DFS Version
class Nodeattr_accessor :name, :neighbors, :visiteddef initialize(name)@name = name@neighbors = []@visited = falseend enddef has_route?(node1, node2)return false if node1.nil? || node2.nil?return true if node1.name == node2.namenode1.visited = truenode1.neighbors.each do |n|next if n.visitedif has_route?(n, node2)return trueendendfalse end
转载于:https://www.cnblogs.com/infinitycoder/p/9185747.html
[Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径相关推荐
- Cracking the coding interview
转自:http://hawstein.com/posts/ctci-solutions-contents.html Cracking the coding interview--问题与解答 March ...
- 经典算法题目:Cracking the coding interview 问题与解答
Cracking the coding interview--问题与解答 March 14, 2013 作者:Hawstein 出处: http://hawstein.com/posts/ctci-s ...
- [Free] Cracking the Coding Interview 6th Download
[Free] Cracking the Coding Interview 6th Download 推荐给有梯子的童鞋们! https://www.pdfdrive.com/cracking-the- ...
- 渣基础:比照Hawstein学Cracking the coding interview(1)
<C++ Primer 第五版>书实在是太长,太厚了.总是看了十几页就看累了,坚持不了多久,想了想还是别勉强自己,决定把它当工具书查看,或者积累足够的C++经验后再翻阅一遍. 目前的打算是 ...
- [Cracking the Coding Interview] 4.4 Check Balanced
Implement a function to check if a binary tree is balanced. For the purpose of this question, a bala ...
- 《Cracking the Coding Interview》——第18章:难题——题目11
2014-04-29 04:30 题目:给定一个由'0'或者'1'构成的二维数组,找出一个四条边全部由'1'构成的正方形(矩形中间可以有'0'),使得矩形面积最大. 解法:用动态规划思想,记录二维数组 ...
- 《Cracking the Coding Interview》——第6章:智力题——题目5
2014-03-20 01:08 题目:扔鸡蛋问题.有一个鸡蛋,如果从N楼扔下去恰好会摔碎,低于N楼则不碎,可以继续扔.给你两个这样的鸡蛋,要求你一定得求出N,怎么扔才能减少最坏情况下的扔的次数? 解 ...
- 《Cracking the Coding Interview》——第18章:难题——题目3
2014-04-29 01:02 题目:从m个整数里随机选出n个整数,要求等概率. 解法:和洗牌的算法类似,每次随机抽出一个数,抽n次即可.时间复杂度O(m * n),空间复杂度O(m). 代码: 1 ...
- 《Cracking the Coding Interview》——第16章:线程与锁——题目3
2014-04-27 19:26 题目:哲学家吃饭问题,死锁问题经典模型(专门用来黑哲学家的?). 解法:死锁四条件:1. 资源互斥.2. 请求保持.3. 非抢占.4. 循环等待.所以,某砖家拿起一只 ...
最新文章
- 如何调用形参数组_函数的参数
- 淡水:21世纪的分子微生物生态学
- matlab矩阵方块网络着色imshow_matlab中用imshow()显示图像与图像矩阵的数据类型的关系...
- python的xpath用法_Python爬虫杂记 - Xpath高级用法
- Maven基础:Maven环境搭建及基本使用(1)
- 如何加强测评机构自身的规范化管理, 不断提高测评的能力和水平
- 分布式系统关注点(21)——构建「易测试」系统的“六脉神剑”
- Rekit Studio简介:用于React和Redux开发的真实IDE
- Registry学习资料
- Django的model form组件
- 基于php+Mysql新闻管理系统 开题报告
- Microsoft Navision 4.0帮助您消除日常工作流程中的烦恼的7条途径
- android url后缀名,Android获取URL中文件的扩展名的方法
- 对比安卓!鸿蒙OS 2.0流畅度实测:差距到底多大?
- 《惢客创业日记》2021.01.21(周四)什么是产品逻辑?
- 今晚直播 | 泰坦尼克号经典案例分析
- 小学数学第3册计算机教案,小学数学教案,小学数学教学设计
- rundown of the Objective-C Type Encodings
- Scrapy爬虫框架视频学习
- 到Visual Studio Code en 2020中的实际实现
热门文章
- WPJAM网址导航:最轻便快捷的WordPress网址导航插件
- 全网首发Oreo易支付开源+教程
- 精品美剧小屏精致灰色风格苹果CMSv10主题
- 东北大学计算机分数线2017,东北大学2017年艺术类专业录取分数线
- 微擎微信公众号小程序框架v2.7.3去sq一键安装纯净商业版
- 你要了解的11款面向Linux系统的一流备份实用工具
- 获取Authorize.Net Transaction Key ( Getting Your Authorize.Net Transaction Key )
- PHP中register_globals参数为OFF和ON的区别
- KVM 通过virsh console连入虚拟机
- 神奇的python(六)之python的串口操作(pyserial)