2014-09-30 26 views
1

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

E.g.像这样: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRIScheduledWeekDaysAct=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())。如果我可以确定相对年龄范围内的最小和最大相对年龄,则可以过滤相对年龄引用的对象。 (if relativeAge < 7if relativeAge >= 7 & relativeAge < 14等。)但我也必须旋转Dates ...

我不能围绕这个包裹我的头,任何想法都赞赏。谢谢!

编辑1:

从本质上讲,问题归结为以下几点:

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

我必须创建下限和上限以形成组这些整数。 的整数,A相对年龄可以是0 336 & 364,并且可以是大于364之间& 7或7 & 14,14 & 21,21 & 28,28 & 56,56 & 84 ...我不得不找到分别落入这些范围的整数。在找到这些整数组(一个组可能持有0个,1个或多个整数)之后,我必须在一定范围内采用最高/最旧的相对年龄组。如果范围在364以上,我将不得不保留最低限度的保存,以防止每年累计保存。 我必须在上述范围内收集这些最高的相对年龄,这些将形成一组相对年龄。

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

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

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

但我仍然不知道如何在Java中编写此算法。

回答

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); 

我分开后,收集相对年龄分组,我遍历相对年龄一遍,检查是否相对ative年龄在一个范围内,如果是这个范围的最后一个和第一个元素。

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

最后,从集合toBePreservedSet我可以涉及到的日期分别被保存下来,并从日期,我可以追溯至文件名,并确定哪些保留,哪些在给定的旋转删除。