给定节假日安排,怎么自动算出调休规则?
AstraSchedule 里我做了一个很有意思的功能,通过公开的节假日安排数据能够自动推算出当年或往年的调休关系,具体是哪一天工作日补的哪一天休息日,也能反查休息日是从哪个工作日调过来的。
TLDR 算法流程
按时间顺序,一一配对。
算法其实不难,甚至说特别简单。后面主要讲讲这个算法是怎么寻思出来的。
怎么想出来的
其实也不是很难想
其实光从 “调休” 这个词来说,他是一个动宾短语,“调” 作为动词有 “调剂” 的意思
调剂:以临万货,以~盈虚。
“调休”的本质是重新调配时间资源——当公共假期”盈”(多了休息日)时,就从周末”虚”处(借出休息日)来补,最终实现工作日与休息日的 总量平衡 。
到这其实就能直接想出上述的算法了。但是如果你语文跟我一样稀烂,
初中化学就教了 化合价 的概念。初中化学教材告诉我们,原子为了形成一个相对稳定结构,会与其他原子相结合。怎么结合呢?以离子为例,电子发生了 “转移” 。类比到调休上,是 节假日 发生了 转移 。所以我们也可以试着给某一天加上一个 “价态”。
比如我们分析一下 2026 年的元旦假期安排:把本该是工作日的休息日标记成 +1 价,把本该是休息日的工作日标记成 -1 价。原本就是休息日或者工作日没变的标记成 0 价。
| 日期 | 星期 | 状态 | 价态 |
|---|---|---|---|
| 2026-01-01 | 四 | 元旦,本来就休息 | 0 |
| 2026-01-02 | 五 | 休息,但本该是工作日 | +1 |
| 2026-01-03 | 六 | 周六,本来就休息 | 0 |
| 2026-01-04 | 日 | 工作,但本该是休息日 | -1 |
Amazing!有趣的是,我们发现这样标记恰好和化合价一样,满足 代数和为 0 的性质。也就是说,同一假期分组内,各日期的价态代数和为 0。而且这个算法的结构也比化合价更简单,化合价还有 +2 价 -3 价这样的,但这个算法只有 -1 0 +1 三种价态。
然后到了初中数学发挥的部分:已知
那么 a 与 b 互为相反数
在实数中,数 的相反数 ,称为其加法逆元
显然, 与 任一为 ,最终 都不可能为 。所以 与 必然一个是 一个是 。那么,由上文的结论可得,每个假期分组的日期价态代数和为 0 可以表述成下面这样:
那么对于每一组 就恰好对应一天休息日和一天工作日。这说明,调休节假日和调休工作日就是可以一一对应起来的
最后就是怎么对应的问题,这个就是经验而言,
那就很简单了:按假日分组,然后按时间顺序排好调休工作日和调休节假日,基于上文的结论,直接一一配对即可。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
