我是旋转算法领域的初学者。我需要增强一个用Java编写的现有备份算法,该算法负责备份数据库并对其进行归档。此算法的一个重要方面是它读取一个INI文件,您可以在其中指定用户想要备份其数据库的星期几。
E.g。像这样:
ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI
要么
ScheduledWeekDaysAct=TUE, FRI
因此,轮换算法必须考虑可以在所有天组合上创建备份。这意味着我不能轻易使用祖父 - 父子算法,我已经实现了。因为我编码的内容预计会在一年中的每一天创建备份,并且与备份代码不兼容。
对于这个问题,有一个算法的想法,一个不太复杂的预期行为,如下:
我无法使用系统日期&时间,我必须解析备份的文件名。 但最终会提供备份日期。
我的方法: 因为我无法知道时间表,哪一天将在哪一天进行备份,所以我必须处理时间间隔,时间段,日期条纹。我需要确定第10次备份后备份的相对年龄。此相对年龄定义为实际参考日期(备份的第10个最早的日期)与第10个保存之前的备份日期之间的天数差。
我可以这样做,我读取文件名,从String
解析日期,从这些解析过的字符串中获取Date
个对象。我可以将它们放入Map<Path, Date>
(稍后我还需要Set
没有重复的功能来删除相同的日期[可能有几个具有相同日期但名称不同的数据库])。
我总是可以确定第10次保存的日期,因此我可以获得引用Date
对象。
因此,我总是可以计算备份的相对年龄。
备份的相对年龄是唯一的,我可以存储Date
的相对年龄,计算它的TreeMap<Integer, Date>
就像keySet()
一样。
我想,我需要处理相对年龄范围(Date
)。如果我可以确定相对年龄范围内的最小和最大相对年龄,那么我可以过滤相对年龄引用的if relativeAge < 7
个对象。
(if relativeAge >= 7 & relativeAge < 14
,Dates
等等。)但我还必须轮换{{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编写这种算法。
答案 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>