2014-09-30 61 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我可以涉及到的日期分別被保存下來,並從日期,我可以追溯至文件名,並確定哪些保留,哪些在給定的旋轉刪除。