暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

编程新说 2021-09-03
417


什么是模型化编程?


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

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

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

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

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



“疏密度”相关问题


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

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

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

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

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


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

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

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

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

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

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


使用“推窗口”方法求解


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


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

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

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

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

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

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



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

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

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

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

(END)


作者现任架构师,工作11年,Java技术栈,计算机基础,用心写文章,喜欢研究技术,崇尚简单快乐。追求以通俗易懂的语言解说技术,希望所有的读者都能看懂并记住。

      

>>> 热门文章集锦 <<<


毕业10年,我有话说

我是一个协程

我是一个跳表

线程池开门营业招聘开发人员的一天

递归 —— 你值得拥有

迄今为止最好理解的ZooKeeper入门文章

基于角色的访问控制(RBAC)

11年码农的肺腑之言,如何成为一个优秀的程序员,送给渴望优秀的人

非著名架构师告诉你,代码该如何写,才能自己写的容易别人看的也不痛苦

迄今为止最硬核的「Java8时间系统」设计原理与使用方法

任何人都需要知道的「世界时间系统」构成原理,尤其开发人员

彻彻底底给你讲明白啥是SpringMvc异步处理

【面试】我是如何面试别人List相关知识的,深度有点长文

我是如何在毕业不久只用1年就升为开发组长的

爸爸又给Spring MVC生了个弟弟叫Spring WebFlux

【面试】我是如何在面试别人Spring事务时“套路”对方的

【面试】Spring事务面试考点吐血整理(建议珍藏)

【面试】吃透了这些Redis知识点,面试官一定觉得你很NB(干货 | 建议珍藏)

【面试】如果你这样回答“什么是线程安全”,面试官都会对你刮目相看(建议珍藏)

【面试】迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)

【面试】一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生(深度好文,建议珍藏)

【面试】如果把线程当作一个人来对待,所有问题都瞬间明白了

Java多线程通关———基础知识挑战

品Spring:帝国的基石

文章转载自编程新说,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论