algoritma rotasi cadangan alternatif java

Saya seorang pemula di dunia algoritma rotasi. Saya perlu meningkatkan algoritma pencadangan yang sudah ada yang ditulis dalam Java yang menangani pencadangan database dan pengarsipannya. Aspek penting dari algoritma ini adalah ia membaca file INI di mana Anda dapat menentukan hari apa dalam seminggu pengguna ingin membuat cadangan database mereka.

Misalnya. seperti ini: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI atau ScheduledWeekDaysAct=TUE, FRI

Jadi, algoritma rotasi harus memperhitungkan bahwa cadangan dapat dibuat pada semua kombinasi hari. Itu berarti saya tidak bisa menggunakan algoritma Kakek-ayah-anak dengan mudah, yang sudah saya terapkan. Karena apa yang saya kodekan mengharapkan cadangan dibuat setiap hari sepanjang tahun dan itu tidak akan kompatibel dengan kode cadangan.

Untuk masalah ini terdapat ide algoritma, perilaku yang diharapkan tidak terlalu rumit, yaitu sebagai berikut:

  • 10 (sepuluh) backup pertama yang terbaru harus selalu disimpan.
  • After the most recent ten is kept, the rest older should be thinned. Not piece by piece, but by datetime. The date of the 10th oldest backup is a designated reference date, to which the older backups will be compared upon a new backup happens. Older backups should be kept and thinned something like the following. After the 10th oldest backup there should be kept:
    • 3 or 4 backups which are the newest on 3-4 prior weeks,
    • 11 cadangan bulanan,
    • 1 cadangan tahunan.

Saya tidak dapat menggunakan tanggal & waktu sistem, saya harus mengurai nama file cadangan. Namun pada akhirnya, tanggal pencadangan diberikan.

Pendekatan saya: Karena saya tidak tahu jadwalnya, pencadangan mana yang akan dilakukan pada hari apa, saya harus bekerja dengan interval, titik, garis tanggal. Saya perlu menentukan usia relatif dari cadangan setelah cadangan ke-10. Usia relatif ini didefinisikan sebagai perbedaan hari antara tanggal referensi sebenarnya (tanggal pencadangan terlama ke-10) dan tanggal pencadangan sebelum penyimpanan ke-10.

Saya bisa melakukan ini, saya membaca nama file, mengurai tanggal dari String, mendapatkan Date objek dari String yang diurai ini. Saya bisa memasukkannya ke Map<Path, Date> (Nanti saya juga memerlukan fitur tanpa duplikat Set untuk menghilangkan tanggal yang sama [mungkin ada beberapa database dengan tanggal yang sama tetapi nama berbeda]). Saya selalu bisa menentukan tanggal penyimpanan ke 10, sehingga saya bisa mendapatkan referensi objek Date. Oleh karena itu saya selalu dapat menghitung usia relatif dari cadangan. Usia relatif dari cadangan bersifat unik dan saya dapat menyimpan usia relatif dengan Date yang dihitung seperti ini TreeMap<Integer, Date>.

Menurut saya, saya perlu bekerja dengan rentang usia relatif (keySet()). Jika saya dapat menentukan usia relatif minimum dan maksimum dalam rentang usia relatif, saya kemudian dapat memfilter objek Date yang direferensikan berdasarkan usia relatif. ( if relativeAge < 7,if relativeAge >= 7 & relativeAge < 14 dan seterusnya.) Tapi saya juga harus memutar Dates...

Saya tidak bisa memikirkan hal ini, ide apa pun dihargai. Terima kasih!

Sunting 1:

Pada dasarnya, masalahnya adalah sebagai berikut:

Saya memiliki daftar bilangan bulat. (Daftar usia relatif): [1, 3, 5, 8, 10, 12, 15, 17, 19, 22, 24, 26...]

Saya harus membuat batas bawah dan atas untuk membentuk kelompok bilangan bulat ini. Bilangan bulat, usia relatif bisa antara 0 & 7 atau 7 & 14, 14 & 21, 21 & 28, 28 & 56, 56 & 84 ... 336 & 364, dan bisa lebih besar dari 364. Saya harus mencari bilangan bulat yang termasuk dalam rentang ini masing-masing. Setelah saya menemukan kelompok bilangan bulat ini (suatu kelompok mungkin berisi 0, 1 atau lebih bilangan bulat), saya harus mengambil usia relatif tertinggi/tertua dalam rentang tertentu, kelompok. Jika kisarannya di atas 364, saya harus mempertahankan simpanan terendah, untuk menghentikan akumulasi simpanan tahunan. Saya harus mengumpulkan usia relatif tertinggi dalam rentang di atas dan ini akan membentuk kelompok usia relatif.

Usia relatif ini secara jelas merujuk pada tanggal file cadangan, jadi sekarang saya akan tahu tanggal/file mana yang menurutnya harus dipertahankan dalam rotasi sebenarnya.

Saya dapat menafsirkan gagasan usia relatif maksimum (maxRelAge) dalam rotasi tertentu, yaitu usia cadangan terlama dibandingkan dengan tanggal referensi sebenarnya.

Saya tidak perlu memeriksa rentang bilangan bulat di atas usia relatif maksimum. Setelah 1 tahun, algoritme akan berjalan sepenuhnya.

Tapi saya masih belum tahu cara mengkode algoritma ini di Java.


person gllo    schedule 30.09.2014    source sumber


Jawaban (1)


Jawaban atas pertanyaan saya sendiri.

Untuk mengimplementasikan algoritma saya memasukkan daftar bilangan bulat ke dalam TreeSet. Saya mengulangi set ini dan memeriksa apakah bilangan bulat (usia relatif) berada dalam rentang usia relatif, dan jika ya, saya mengumpulkannya ke set lain, seperti ini:

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

Ini dapat dipanggil beberapa kali sambil mengulangi usia relatif:

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

Setelah saya memisahkan, mengumpulkan usia relatif ke dalam kelompok, saya mengulangi usia relatif lagi, memeriksa apakah usia relatif berada dalam suatu rentang, dan jika ya, saya mengambil elemen terakhir dan pertama dari rentang tersebut.

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

Terakhir, dari kumpulan toBePreservedSet saya dapat menghubungkan masing-masing tanggal yang akan disimpan, dan dari tanggal saya dapat menghubungkan kembali ke nama file dan menentukan mana yang akan dipertahankan dan mana yang akan dihapus dalam rotasi tertentu.

person gllo    schedule 03.10.2014