java替代备份轮换算法

时间:2014-09-30 14:26:11

标签: java algorithm rotation backup

我是旋转算法领域的初学者。我需要增强一个用Java编写的现有备份算法,该算法负责备份数据库并对其进行归档。此算法的一个重要方面是它读取一个INI文件,您可以在其中指定用户想要备份其数据库的星期几。

E.g。像这样: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI 要么 ScheduledWeekDaysAct=TUE, FRI

因此,轮换算法必须考虑可以在所有天组合上创建备份。这意味着我不能轻易使用祖父 - 父子算法,我已经实现了。因为我编码的内容预计会在一年中的每一天创建备份,并且与备份代码不兼容。

对于这个问题,有一个算法的想法,一个不太复杂的预期行为,如下:

  • 应始终保留前10(十)个最新备份。
  • 在保留最近的十个之后,应该减少其余的年龄。不是一块一块,而是按日期时间。第10个最早备份的日期是指定的参考日期,旧备份将在新备份发生时进行比较。应保留较旧的备份并将其缩小,如下所示。 在第10个最老的备份之后应该保留:
    • 3或4次备份,这是前几周3-4次的最新备份,
    • 每月11次备份,
    • 每年1次备份。

我无法使用系统日期&时间,我必须解析备份的文件名。 但最终会提供备份日期。

我的方法: 因为我无法知道时间表,哪一天将在哪一天进行备份,所以我必须处理时间间隔,时间段,日期条纹。我需要确定第10次备份后备份的相对年龄。此相对年龄定义为实际参考日期(备份的第10个最早的日期)与第10个保存之前的备份日期之间的天数差。

我可以这样做,我读取文件名,从String解析日期,从这些解析过的字符串中获取Date个对象。我可以将它们放入Map<Path, Date>(稍后我还需要Set没有重复的功能来删除相同的日期[可能有几个具有相同日期但名称不同的数据库])。 我总是可以确定第10次保存的日期,因此我可以获得引用Date对象。 因此,我总是可以计算备份的相对年龄。 备份的相对年龄是唯一的,我可以存储Date的相对年龄,计算它的TreeMap<Integer, Date>就像keySet()一样。

我想,我需要处理相对年龄范围(Date)。如果我可以确定相对年龄范围内的最小和最大相对年龄,那么我可以过滤相对年龄引用的if relativeAge < 7个对象。 (if relativeAge >= 7 & relativeAge < 14Dates等等。)但我还必须轮换{{1}} ......

我无法绕过这个,任何想法都会受到赞赏。谢谢!

修改1:

基本上,问题归结为以下几点:

我有一个整数列表。 (相对年龄列表):[1,3,5,8,10,12,15,17,19,22,24,26 ...]

我必须创建下边界和上边界以形成这些整数的组。 整数,相对年龄可以在0和0之间。 7或7&amp; 14,14&amp; 21,21&amp; 28,28&amp; 56,56&amp; 84 ... 336&amp; 364,并且可以大于364.我必须找到分别落入这些范围的整数。在我发现这些整数组(一组可能包含0,1个或更多整数)后,我必须在一定范围内取最高/最老的相对年龄组。如果范围高于364,我将必须保留最低保存,以阻止每年保存累积。 我必须在上述范围内收集这些最高相对年龄,这些将形成一组相对年龄。

这些相对年龄明确地引用了备份文件的日期,所以现在我将知道根据它应该在实际轮换中保留哪个日期/文件。

我可以解释给定旋转中最大相对年龄(maxRelAge)的概念,即相对于实际参考日期的最旧备份的年龄。

我不必检查高于最大相对年龄的整数范围。 1年后,算法将完全运行。

但我仍然不知道如何用Java编写这种算法。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。

为了实现算法,我将整数列表放入TreeSet。我迭代了这个集合并检查一个整数(相对年龄)是否在相对年龄范围内,如果是,我将它们收集到另一个集合中,如下所示:

private void checkRelativeAge(TreeSet<Integer> ageGroup, int relAge, 
int boundary, int offset) {
    if (relAge > boundary & relAge <= boundary + offset) {
        ageGroup.add(relAge);
    }
}

在迭代相对年龄时,可以多次调用它:

checkRelativeAge(relAgesBetween336And364, relAge, 336, 28);
checkRelativeAge(relAgesBetween308And336, relAge, 308, 28);
checkRelativeAge(relAgesBetween280And308, relAge, 280, 28);

...

checkRelativeAge(relAgesBetween7And14, relAge, 7, 7);
checkRelativeAge(relAgesBetween1And7, relAge, 0, 7);

在我分开后,将相对年龄收集到组中,我再次迭代相对年龄,检查相对年龄是否在一个范围内,如果是,我采取该范围的最后一个元素。

    if (relAge > boundary & relAge <= boundary + offset) {
        toBePreservedSet.add(dateRelativeAgeMap.get(ageGroup.last()));
        toBePreservedSet.add(dateRelativeAgeMap.get(ageGroup.first()));
    }

最后,从集合toBePreservedSet我可以分别与要保留的日期相关联,并且从日期我可以关联到文件名,并确定在给定的轮换中保留哪些以及删除哪些日期。 / p>