美文网首页On lzq ways
高级应用篇一

高级应用篇一

作者: zhengqiuliu | 来源:发表于2019-06-17 23:32 被阅读2次

问题一:如何确定代码源文件的编译依赖关系?一个完整的项目会包含很多代码源文件。编译器在编译整个项目时,需要按照依赖关系,依次编译每个源文件。那编译器该如何通过源文件两两之间的局部依赖关系,确定一个全局的编译顺序呢?

解题思路:这个问题可以抽象成一个拓扑排序的问题。我们可以把源文件与源文件之间的依赖关系,抽象成一个有向图。每个源文件对应图中的一个顶点,源文件之间的依赖关系就是顶点之间的边。依赖关系不仅要是有向的,而且不能出现循环依赖,这也正好符合拓扑排序本身的特点,就是基于有向无环图的一个算法。

实现方式:拓扑排序的两种实现方式,一种是Kahn算法,另一种是DFS算法。

Kahn算法:统计每个顶点的入度,先把入度=0的顶点放入队列中。然后遍历队列,让入度=0的顶点A出队列。再遍历顶点A指向的顶点,并且使指向的顶点的入度都减一,如果满足入度=0,则把其也加入队列中。整个过程就是先计算入度=0的顶点,然后把入度=0的顶点所指向的顶点的入度-1,然后再次计算入度=0的顶点,从而就确定了一个依赖的先后关系。

DFS算法:通过邻接表构造逆邻接表。然后递归处理每个顶点,并先把它依赖的所有顶点输出了,然后再输出自己。实现代码如下:


问题二:像Google地图,百度地图,高德地图这样的软件。如果你想从家开车到公司,你输入起始,结束地址,地图就会给你规划一个最优出行路线。比如:最短路线,最少用时路线,最少红绿灯路线等等,作为一名软件工程师,你是否思考过地图软件的最优路线是如何计算出来的?底层依赖了什么算法呢?

解题思路:先解决最简单的,最短路线。把问题抽象成数据结构,显然地图抽象成图最合适不过了。把每个岔路口看作一个顶点,岔路口与岔路口之间的路看作一条边,路的长度就是边的权重。如果路是单行道,我们就在两个顶点之间画一条有向边;如果路是双行道,我们就再两个顶点间画两条方向不同的边。这样,整个地图就被抽象成一个有向有权图。提到最短路径算法,最出名的莫过于Dijkstra算法了。

实现方式:Dijkstra算法的代码实现如下图所示:

关于最少红绿灯的出行方案,我们只需要把每条边的权值改为1即可,算法还是不变,可以继续使用前面讲的Dijkstra算法。不过,边的权值为1,也就相当于无权图了,我们还可以使用广度优先搜索算法。

相关文章

  • 高级应用篇一

    问题一:如何确定代码源文件的编译依赖关系?一个完整的项目会包含很多代码源文件。编译器在编译整个项目时,需要按照依赖...

  • 高级应用篇五

    问题:人物处于游戏地图的某个位置的时候,我们用鼠标点击另一个相对较远的位置时,人物会自动绕过很多障碍物走过去,玩过...

  • 高级应用篇六

    问题:算法的目的就是为了提高代码的执行效率。那当算法无法再继续优化的情况下,我们该如何来进一步提高执行效率呢?那就...

  • 高级应用篇四

    问题:在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库索...

  • 高级应用篇二

    问题:网页爬虫是搜索引擎中非常重要的系统,负责爬取几十亿,上百亿的网页。而同一个网页链接有可能被包含在多个页面中,...

  • 高级应用篇三

    问题一:如果你是一名手机应用开发工程师,让你实现一个简单的垃圾短信过滤功能以及骚扰电话拦截功能,该用什么样的数据结...

  • iOS开发 多线程的高级应用(一)

    iOS开发 多线程的高级应用(一) OS开发 多线程的高级应用(一)

  • rabbitMQ高级整合应用第三篇 SimpleMessageL

    ​rabbitMQ精讲系列第二十一篇 高级整合应用第三篇SimpleMessageListenerContaine...

  • 高级应用--JDBC(一)

    为什么要使用JDBC? 如何使用JDBC? 使用JDBC进行增删改查 使用预编译PreparedStatement...

  • 最新web前端相关课程学习链接

    js基础篇 js进阶篇 js高级篇 vue基础篇 vue高级篇 react基础 react高级 Nodejs基础 ...

网友评论

    本文标题:高级应用篇一

    本文链接:https://www.haomeiwen.com/subject/zahtqctx.html