Sparrow算法篇 从日期取交集到思维模式

日期交集

早在13年左右的时侯,做过一个系统,功能很简单,做一个日程管理功能,这里边涉及到一个小知识点,就是日期取交集。今天跟大家分享的是从这个点展开的,时间段取交集的话题。

业务逻辑

逻辑很简单,就是一两个日期段取交集,可如果按正常思维去实现,其实日期交集的场景我们可以穷举出来,大概有4种情况

    s1--------------e1
        s2-----------------e2
        s1--------------e1
    s2-----------e2
        
    s1-----------------e1
        s2-------e2
         s1-------e1
    s2-----------------------e2

如果按这种逻辑实现我们的表达式可能至少要写4种情况,逻辑复杂,且可读性差

逆向思维

这是软件开发中非常重要的思维模式,在程序员数学中有重点介绍。
这里提到的程序员数学,是一套书,包括程序员基础数学,概率论和线性代数,同时也是进入机器学习的基础理论,有兴趣的朋友可以买回来读一读。
我们通过个例子,来实践一下逆向思维。
其实如果按取交集的逻辑来看,上面穷举出来有4 种情况。
但我们反过来想(逆向)
没有交集的情况只有两种可能

                s1-------------e1
    s2------e2
    s1------e1
                s2--------------e2

我们设
两个时间段的日期为s1(start)-e1(end)
和s2-e2
通过逆向推导可以推出下列表达式

这里我们假定

s1<e1 & s2<e2

=>

e2<s1||e1<s2

说明满足该条件是不可能产生交集
上述表达式翻译成业务语言即

第一个时间段已经结束,第二个时间段还没未开始

通过对表达式取非即所有存在交集的情况

!(e2<s1||e1<s2)

=>

e2>=s1&&e1>=s2

这个就可以做为时间取交集的最终表达式

这里有一点非常重要,这个时间段我们有条件的

s1<e1 & s2<e2

这是表达式成立的充分条件

问题

这里我们只是把时间交集的表达式推导出来,我们把该命题扩展一下,目前我们只是取两个时间段的交集,如果取n个时间段的交集如何实现呢?


时间段交集
  • 这样的时间段有成百上千条该如何处理?
  • 如果我们需要根据具有日期交集的时间段分组呢?
  • 如果我们的业务不是日期,而是其他数据类型呢?如何抽象出计算模型?非日期型数据也可以进行分组?

以上问题请关注下一篇博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 早上,七点和客栈一家人吃完早餐后,就开了两台车出发去莲花湖,路上的风景,美的像新西兰(虽然我没去过新西兰) 经过一...
    一个大齐阅读 3,017评论 0 0
  • 周至老农民猕猴桃 原价 88元包邮五斤 现促销价️️元五斤净重。 大果(18-23个) 单重90-120克 发百...
    老农民回复慢请见谅阅读 1,241评论 0 0
  • 寄存器IE(8位):对单片机系统所有中断以及某个中断源的开放和屏蔽的控制 EX0(IE.0),外部中断0允许位; ...
    又是那一片天阅读 5,305评论 0 1
  • 自从考完BEC之后,整个人都放松了下来,没有目标,在宿舍除了睡觉就是玩手机或是煲剧。除了累还是累,而且也认识到我不...
    SakuraEchoWong阅读 1,170评论 0 0