Я новичок в мире алгоритмов вращения. Мне нужно улучшить уже существующий алгоритм резервного копирования, написанный на Java, который занимается резервным копированием баз данных и их архивированием. Важным аспектом этого алгоритма является то, что он читает INI файл, в котором вы можете указать, какие дни недели пользователь хочет создать резервную копию своих баз данных.
Например: 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, 3, 5, 8, 10, 12, 15, 17, 19, 22, 24, 26...]
Я должен создать нижнюю и верхнюю границы для формирования групп этих целых чисел. Целое число, относительный возраст может быть между 0 и 7 или 7 и 14, 14 и 21, 21 и 28, 28 и 56, 56 и 84... 336 и 364 и может быть больше 364. Мне нужно найти целые числа, которые попадают в эти диапазоны соответственно. После того, как я найду эти группы целых чисел (группа может содержать 0, 1 или более целых чисел), я должен принять самый высокий/самый старый относительный возраст в определенном диапазоне, группе. Если диапазон выше 364, мне нужно будет сохранить минимальное сохранение, чтобы остановить ежегодное сохранение от накопления. Я должен собрать эти самые высокие относительные возрасты в вышеуказанных диапазонах, и они составят группу относительных возрастов.
Эти относительные возрасты однозначно указывают даты файлов резервных копий, поэтому теперь я буду знать, какая дата/файл в соответствии с ним должны быть сохранены при фактическом ротации.
Я могу интерпретировать понятие максимального относительного возраста (maxRelAge) в данном ротации, то есть возраст самой старой резервной копии относительно фактической контрольной даты.
Мне не нужно изучать диапазоны целых чисел выше максимального относительного возраста. Через 1 год алгоритм будет работать в полном объеме.
Но я до сих пор не знаю, как закодировать этот алгоритм в Java.
Ответьте на мой вопрос.
Чтобы реализовать алгоритм, я помещаю список целых чисел в 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
я могу относиться к датам, которые должны быть сохранены, соответственно, и из дат, которые я могу связать с именами файлов, и определить, что сохранить и удалить для данного вращения.