0
点赞
收藏
分享

微信扫一扫

Android 启动优化(一) - 有向无环图,面试字节跳动被问Android屏幕适配方案

月孛星君 2022-03-11 阅读 24

由于有这个特点,因此常常用有向无环图的数据结构用来解决依赖关系。

上图中,拓扑排序之后,任务2肯定排在任务1之后,因为任务2依赖 任务1, 任务3肯定在任务2之后,因为任务3依赖任务2。

拓扑排序一般有两种算法,第一种是入度表法,第二种是 DFS 方法。下面,让我们一起来看一下怎么实现它。

入度表法


入度表法是根据顶点的入度来判断是否有依赖关系的。若顶点的入度不为 0,则表示它有前置依赖。它也常常被称作 BFS 算法

算法思想

  • 建立入度表,入度为 0 的节点先入队

  • 当队列不为空,进行循环判断

    • 节点出队,添加到结果 list 当中
  • 将该节点的邻居入度减 1

  • 若邻居节点入度为 0,加入队列

  • 若结果 list 与所有节点数量相等,则证明不存在环。否则,存在环

实例讲解

下图所示的有向无环图,采用入度表的方法获取拓扑排序过程。

!

首先,我们选择入度为 0 的顶点,这里顶点 1 的入度为 0,删除顶点 1 之后,图变成如下。

这时候,顶点 2 和顶点 4 的入度都为 0,我们可以随便删除一个顶点。(这也就是为什么图的拓扑排序不是唯一的原因)。这里我们删除顶点 2,图变成如下:

这时候,我们再删除顶点 4,图变成如下:

选择入度为 0 的顶点 3,删除顶点 3 之后,图标称如下,

最后剩余顶点5,输出顶点5,拓扑排序过程结束。最终的输出结果为:

到此,优先无环图的入度法的流程已经讲解完毕。你清楚了嘛。

代码的话,下期会一起给出。

时间复杂度

设 AOE 网有 n 个事件,e 个活动,则算法的主要执行是:

  • 求每个事件的ve值和vl值:时间复杂度是O(n+e) ;

  • 根据ve值和vl值找关键活动:时间复杂度是O(n+e) ;

因此,整个算法的时间复杂度是O(n+e)

DFS 算法


从上面的入度表法,我们可以知道,要得到有向无环图的拓扑排序,我们的关键点要找到入度为 0 的顶点。然后接着删除该结点的相邻所有边。再遍历所有结点。直到入度为 0 的队列为空。这种方法其实是 BFS。

说到 BFS,我们第一时间就想到 DFS。与 BFS 不同的是,DFS 的关键点在于找到,出度为0的顶点。

总结如下,深度优先搜索过程中,当到达出度为0的顶点时,需要进行回退。在执行回退时记录出度为0的顶点,将其入栈。则最终出栈顺序的逆序即为拓扑排序序列。

算法思想

  • 对图执行深度优先搜索。

  • 在执行深度优先搜索时,若某个顶点不能继续前进,即顶点的出度为0,则将此顶点入栈。

  • 最后得到栈中顺序的逆序即为拓扑排序顺序。

实例讲解

同样,以下图讲解 DFS 算法的过程。

(1) 从顶点 1 开始出发,开始执行深度优先搜索。顺序为1->2->3->5。

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】点击:Android架构视频+BAT面试专题PDF+学习笔记即可获取!查看免费领取方式!

ndroid%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)即可获取!查看免费领取方式!**

[外链图片转存中…(img-BjQt8x72-1646472229309)]

举报

相关推荐

0 条评论