码迷,mamicode.com
首页 > 其他好文 > 详细

模型化编程 | 使用“推窗口”方法求解「疏密度」相关问题

时间:2020-12-15 11:38:53      阅读:3      评论:0      收藏:0      [点我收藏+]

标签:图片   抽象   观测   轻松   别人   小朋友   事件   inf   大脑   

什么是模型化编程?

模型化编程是我在前几天的一篇文章《非著名架构师告诉你,代码该如何写,才能自己写的容易别人看的也不痛苦》中提出的,意思是在写代码前,先为代码找到一个与之非常相近的模型,然后在大脑里把这个模型想清楚并构建好。

这样写代码时就按照这个模型来写,保证写出来的代码是正确的,而且整体看起来也非常清晰,绝对不会有“东一枪,西一炮”这样凌乱的感觉。

当我们向别人介绍时,就把这个模型描绘出来,只要对方熟悉了这个模型,其实就等于熟悉了我们的代码。这样的交流不仅效率高,而且绝对不会产生歧义。

当采用这种方法时,可以迫使开发人员主动加强对问题或需求的思考,进而加深对相关事物或领域的了解,这样做不仅可以减少出错的可能性,而且还会使解决方法更加的正确。

当然,我也没有说必须采用这样的方法。只是采用的话会相对更加合理化、简单化和科学化一些。

“疏密度”相关问题

我曾在工作中遇到求解事物“稀疏”和“密集”程度的问题。其实这类问题颇为常见,在生活中都有好多。

比如上下班高峰期,路上行驶的车辆非常密集。等到了晚上十点以后,路上的车辆就非常的稀疏了。

那我们如何来描述车流的疏密度呢?最常用的方法可能就是在单位时间内通过某个路段的车辆数目。

假设我们把“一辆车在某个时刻通过某一路段”这个事情看作是发生了一个“事件”,那么许多车辆在不同的时刻通过这一路段就是许多的事件发生。

如果我们把每个事件作为一个点,并把它们在时间轴上画出来。整体看起来就是在时间轴上分布的许多密集程度不同的点。

技术图片
抽象的说法就是,随着时间的推移,事件在一个个逐渐发生。实际的含义就是在不同的时间经过的一个个车辆。

点稀疏的部分就表示这段时间内车流量较小,点密集的部分则表示车流量较大。

这样我们就把车流疏密度的问题转换为时间轴上点的疏密度问题,这样事情不仅得到了简化,而且也更加的具体化了。

假设已经观测了24小时,并且记录下了全部数据。此时,我们提出一个问题:

在1小时内,经过的车辆数目最多时是多少,最少时是多少,分别是在哪个时刻发生的?

这个问题本身不难,即使不采用模型化编程,写起代码来也不太麻烦。但是,如果采用模型化编程,会变得非常之简单。

使用“推窗口”方法求解

我们抽象出一个时间窗口,窗口的宽度就是1个小时的时间,然后把窗口放在时间轴的左侧起始处,使窗口的左边缘与时间轴上的第一个点对齐。
技术图片

然后按照下面的方法反复进行即可:

1、计算出窗口里的点的数目,记录下这个数目,并记录下窗口左侧对应的点在时间轴上的时刻。

2、向右推一下窗口,使窗口前进一个点,此时窗口的左边缘与时间轴上的第二个点对齐。

3、和第1步一样,计算和记录数目,并记录时刻,并且与第1步里的数据进行比较和相应的更新。

4、和第2步一样,向右推一下窗口,使前进一个点。

就这样一直推下去,直到推到最后,即窗口的右边缘与时间轴上的最后一个点对齐,就结束了。

技术图片

在整个过程中,我们已经记录下了最大数目和最小数目,以及它们分别对应的时刻。

回味一下,有了这个“窗口”模型以后,是不是一下子变得特别特别简单啊。几乎一年级的小朋友都能懂。

自己大脑里想着这个模型时,写代码变得非常轻松。别人大脑里想着这个模型时,看我们的代码也变得非常轻松。

也许这个简单的问题并不足以展示模型化编程的强大威力,但是等到复杂问题时,一定会见分晓的。

(END)

模型化编程 | 使用“推窗口”方法求解「疏密度」相关问题

标签:图片   抽象   观测   轻松   别人   小朋友   事件   inf   大脑   

原文地址:https://blog.51cto.com/15049788/2561457

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!