《剑指offer》:[56]五岔路口交通管理红绿灯设计

抽象建模能力
       计算机只是一种工具,是为我们服务所驱使的工具,我们不能一头扎入这个编程的海洋出不来甚至迷失了方向。它的作用是帮助我们解决实际生活中的问题。程序员的工作就是把各种现实的问题抽象成数学模型并用计算机的编程语言表达出来,所以我们应该培养自己从日常生活中抽取提炼出问题并建立相应的数学模型,找到问题的规律并解决问题的能力。
建模的第一步:从具体问题中抽象选择合适的数据结构来表述问题;
建模的第二步:分析模型的内在规律,设计一个解此数学模型的算法;
建模的第三步:编出程序,也就是用编程语言表达这种规律,进行结果的分析及调试直至成功。

       比如青蛙跳台阶问题实质就是斐波拉切问题;还有五岔道路口的交通管理其实就是图的问题,可以用着色来解决。还有图书馆里的图书的查找管理也是一种线性的数据结构,计算不规则物体的体积和面积就是微积分问题,等等,我们一定要培养这种从事物中抽象出问题核心的东西。

      下面主要介绍一个多岔路口交通灯的管理问题,由于该节的知识点在[37]中已经讲过了,所以在这里插入一点书外知识。

     在一般的道路上,我们通常看见的就是红绿两种颜色的交通灯,这样就可以保持正常的交通秩序,又能达到车流量的最大量。以前当我站在人来人往的天桥上,车如马龙的街道上的时候,看见这个红绿灯,看着它默默的每天都是周而复始,帮助这个城市有秩序的运转,就不明觉厉。能感觉到红绿两色对于城市交通的重要性和意义!虽然看起来简单,但是要想达到让整个城市的交通畅通无阻而且每天能发挥出公路的最大效率,也就是大道车流量的最大值,背后却不是这么简单的,需要合理的算法设置灯的颜色以及更好实现全局协作。交通情况如下图所示:


                          图一                                                                       图二

    下面就简单的来说说交通灯的问题吧!--摘自严蔚敏老师的《数据结构》(C语言版)一书,觉得挺有意思就写了下来:

    题目: 要求设计一种交通灯方案,使过往的车辆能有秩序的行驶不发生冲突,并且充分最大发挥公路的效率,尽最大可能缓解城市的交通压力。

    例如在中上图一中,就是一个城市的五岔路口,ABCDE分别表示这五个路口,E和C分别是单向车道。这里每天都有大量的车流量。通常这类交通、道路问题的数学模型是一种称为“图”的数据结构。图二中的每个顶点表示一条通路,如AB代表车从A开向B。而如果存在矛盾的通路我们用连线来表示,例如AB和EA之间有一条连线,表示有车从A向B行驶的时候就不能有车从E到A行驶。

     由此,我们知道在图二中,每个圆圈表示图a五岔路口上的一条通路,两个圆圈之间的连线表示这两个圆圈不能同时通行。经过这样的设计抽象和转化后,看似复杂的问题这这里设置交通灯的问题就可以等价为:对图着色的问题,
     问题转换为:要求对图上的每个顶点然一种颜色,并且要求有线相连的两个顶点不能具有相同的颜色,而使用的总的颜色种类尽量的少。
    上图二中就是一种着色方案。例如将红色、黄色、蓝色和绿色分别编号为1,2,3,4号灯,那么当4号灯为绿色时,那么只有DA和DB两条路可以通行,其他的都要显示为红色,禁止通行。只有这样才能保证在 这个五岔路口车辆能有序的行驶,且效率最高,而且最重要的是把发生意外的可能降到了最低。


©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页