考虑你有几种日期P1 - Pn的模式。
有些像P1一样简单 - 所有星期一,P2--整个星期二;其他人比P4更复杂 - 所有工作日等。
对于自定义日期数组(V1,V2),我必须创建最短的结果字符串,如图所示:
对于任何数组,我们必须创建表示数组中日期的字符串。最简单的方法是创建字符串,如1.5.2013,2.5.2013,3.5.2013 ......但结果字符串将非常长。
使用多个预定义模式,我们可以创建更短的结果字符串。
对于结果字符串,我使用以下规则:
单日期格式:DD.MM.YYYY (10个字符)
枚举(日期和模式):逗号和空格(2个字符)
日期间隔:DD.MM.YYYY-DD.MM.YYYY (21个字符)
模式名称的间隔:Px-Py (5个字符)
特殊字词:(6个字符)
结果字符串的示例:
使用P4模式的V1:
P4除了01.05.2013-03.05.2013,0.0.05.2013,10.05.2013,16.05.2013,17.05.2013 (80个字符)
使用Pn模式的V1:
Pn 06.05.2013-08.05.2013,13.05.2013-15.05.2013,20.05.2013-24.05.2013,27.05.2013-31.05.2013 (94个字符)
使用最佳模式匹配的V1:
P1-P3 01.05.2013-19.05.2013,P4 20.05.2013-31.05.2013 (54个字符)
主要目标是创建最短的结果字符串。据我所知,我们可以通过找到最佳匹配模式/模式来实现这一目标。
目前我正在努力调整背包问题和最常见的子序列问题,但我不确定它是否是正确的方向。
我很感激任何想法。
更新
感谢 Jan Dvorak 对我的问题的简短描述:
目标是使用预定义的字典(P1..Pn和所有间隔和单个日期)描述V,其中允许交叉,并集和减法,并且每个操作和原子都有预定义的成本(结果字符串中的字符数) )。
答案 0 :(得分:1)
经过长时间的搜索,我们终于找到了非常接近我们想要的解决方案。
http://www.fpz.unizg.hr/traffic/index.php/PROMTT/article/view/1287
感谢所有人的参与。
答案 1 :(得分:0)
这只是一个建议,但如果你想要一个代表日期数组的非常短的字符串,你可以用完全不同的方式解决这个问题,这种方式非常简单有效。
让1代表一天“seleceted”并让0代表一天“未选择”,然后你可以构造一个二进制数来表示一个月内的自定义日期数组,例如,对于V1情况你可以生成这个二进制数号:
V1 = 0000011100001110000111110011111
所以前0表示日期1.5.2013是“未选中”,下一个0表示日期2.5.2013是“未选中”,等等。如果你将这个数字分成8位组(除以二进制数以字节为单位)然后你可以创建这个字节数组:
V1(starting in May 1, 2013) = 00000111 - 00001110 - 00011111 - 00111110 (4 bytes)
使用此方法,您只需使用4个字节来表示V1,如果您知道V1从1.5.2013开始,那么这是您需要的唯一信息,因此您还需要存储初始日期,这样您就可以表示仅使用3个字节的月份和年份,因此例如2013年5月的日期可以用这种方式表示:
5月=第5个月所以5个二进制是101
2013二进制是11111011101 因此,使用3个字节,您可以将2013年5月表示为:
0000101 00000111 11011101
[ 5 ] [ 2013 ]
所以你可以将V1表示为
V1= 0000101 - 00000111 - 11011101 00000111 - 00001110 - 00011111 - 00111110
[Month] [ Year ] [ V1 custom array of dates ]
所以V1只能用7个字节完全表示!!
如果需要String而不是字节数组,则可以将此字节数组转换为a Base64字符串,因此V1可以表示为字符串
V1 in Base64 is Cg+6Dhw+Pg== (using just 12 characters!!)
在V2的情况下:
V2 = 0000101 - 00000111 - 11011101 11111111 - 11111111 - 11111111 - 11101110
[Month] [ Year ] [ V2 custom array of dates ]
V2 in Base64 is Cg+7////bg== (using just 12 characters again!!)
使用这种方法,您知道一个月的自定义日期信息数组可以用7个字节表示(如果您使用基本的64个字符串,则表示12个字符)。
要在您需要的一年中存储自定义数组信息: 开始月份和年份为3个字节,加上365/8 = 45.625(四舍五入为46个字节),即49个字节!全年,基地64的最大长度为69个字符!!!
这很容易实现,在代码中易于维护,比复杂的模式匹配算法更好,这种气味对我来说是一个很好的解决方案。我希望这个建议符合您的要求。