多模式匹配算法

时间:2013-05-26 11:01:04

标签: arrays algorithm pattern-matching

考虑你有几种日期P1 - Pn的模式。

有些像P1一样简单 - 所有星期一,P2--整个星期二;其他人比P4更复杂 - 所有工作日等。

对于自定义日期数组(V1,V2),我必须创建最短的结果字符串,如图所示:

Multi Pattern Matching

对于任何数组,我们必须创建表示数组中日期的字符串。最简单的方法是创建字符串,如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,其中允许交叉,并集和减法,并且每个操作和原子都有预定义的成本(结果字符串中的字符数) )。


2 个答案:

答案 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个字符!!!

这很容易实现,在代码中易于维护,比复杂的模式匹配算法更好,这种气味对我来说是一个很好的解决方案。我希望这个建议符合您的要求。