组日期范围为桶

时间:2017-10-24 18:44:52

标签: java algorithm math

我有一个问题,我有一个日期范围,我想将日期范围分成块(用户提供的数量)。每个块必须是整个月的连续范围。最长的块必须等于或比最短的长一个月。

日期范围也是整月:

  • 开始日期始终是本月的第一天
  • 结束日期将始终是该月的最后一天。

您可以假设输入范围足够大,每个块至少可以有一个月。

例如,考虑日期范围为1/1/2000到8/31/2000的简单情况,请求8个块。然后每个块都会整整一个月。

更容易想到这个问题的方法如下 考虑1-15的数字列表 我们想把它们分成8个块 可能的组合是

(1),(2),(3),(4),(5),(6),(7),(8,9,10,11,12,13,14,15) -> satisfies only one constraints of using up all the chunks
(1,9),(2,10), (3,11), (4,12), (5,13), (6,14), (7,15), (8) ---> satisfies only 1 constraint of minimizing the difference between maximum number and minimum numbers in a chunk.

(1,2), (3,4), (5,6), (7,8) (9,10), (11,12) (13,14), 15  ---> correct

我认为joda时间是日期库。

这不是作业问题。我试图并行化一个以日期范围为输入的查询。这些块应该是核心,我想在核心的后续日期范围内运行查询。

2 个答案:

答案 0 :(得分:1)

这不是一个难题。有一个简单的结构来完成这项工作。首先,请注意你不关心几天,只有整整几个月。

  • 计算范围内的月数。忘记日子,只需使用 一个月和一年。将这些输入称为m1/d1/y1(开始)和m2/d2/y2(结束)。 m_range = 12*(y2-y1) + m2-m1 + 1
  • 调用输入块计数chunk。如果m_range < chunk,则输入无效。
  • 最小块大小为min_size = floor(m_range/chunk)(截断分割)。最大尺寸是一个。
  • 如果分割不均匀,那么您将有一些剩余的分配时间。将此额外计算为extra = m_range mod chunk

使用这些参数,分配很简单:第一个extra块每个额外获得一个月,并且大小为min_size+1。剩余的chunk-extra块每个min_size个月。

例如,让我们采取一个范围1/1/2017 - 5/31/2018,以及4个块。

m_range = 12*(2018-2017) + (5-1) + 1 = 12 + 4 + 1 = 17
min_size = floor(m_range/chunk) = floor(17/4) = 4
extra = m_range mod chunk = 1

所以,你给第一个大块5个月;其他3个大块各4个月。

个人日期操作留给学生练习。 : - )

答案 1 :(得分:0)

给定日期范围计算该范围内的天数。我不熟悉joda数据库,也许它可以做到这一点。如果没有,我从头开始这样做,我会写一个执行此操作的功能(硬编码日历,1月31日,2月28日等)。如果相关,请注意闰年。

获得总时间范围内的天数后,将该数字除以块数。现在你有多少天应该在每个块中。然后从第一个日期开始构建您的间隔,并在其中添加表示“每个块中的天数”的数字。有时间隔将在一个月内开始,并在未来一个月结束,这是您需要使用库或硬编码的参考来确定每月的天数。

希望这有帮助。

编辑:请参阅下面的评论,了解有助于提供帮助的功能的链接。

Edit2:这个答案在我做出这个回复之后看到问题的编辑方式并没有多大帮助。但是我评论中链接的功能仍然有用。