ฉันเป็นมือใหม่ในโลกแห่งอัลกอริธึมการหมุน ฉันจำเป็นต้องปรับปรุงอัลกอริธึมการสำรองข้อมูลที่มีอยู่แล้วซึ่งเขียนด้วยภาษา Java ซึ่งดูแลการสำรองฐานข้อมูลและการเก็บถาวร สิ่งสำคัญของอัลกอริธึมนี้คือการอ่านไฟล์ INI ซึ่งคุณสามารถระบุวันในสัปดาห์ที่ผู้ใช้ต้องการสำรองฐานข้อมูลได้
เช่น. เช่นนี้: ScheduledWeekDaysAct=MON, TUE, WED, THU, FRI
หรือ ScheduledWeekDaysAct=TUE, FRI
ดังนั้นอัลกอริธึมการหมุนจะต้องคำนึงว่าสามารถสร้างการสำรองข้อมูลได้ในทุกชุดของวัน นั่นหมายความว่าฉันไม่สามารถใช้อัลกอริธึมปู่-พ่อ-ลูกอย่างง่ายดายที่ฉันเคยใช้ไปแล้ว เพราะสิ่งที่ฉันเขียนโค้ดคาดหวังว่าการสำรองข้อมูลจะถูกสร้างขึ้นในแต่ละวันของปี และนั่นจะไม่เข้ากันกับโค้ดสำรอง
สำหรับปัญหานี้ มีแนวคิดเกี่ยวกับอัลกอริทึม ซึ่งเป็นพฤติกรรมที่คาดหวังที่ไม่ซับซ้อนเกินไป ซึ่งมีดังต่อไปนี้:
- ควรเก็บข้อมูลสำรองล่าสุด 10 (สิบ) อันดับแรกไว้เสมอ
- 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 เดือน
- สำรองข้อมูล 1 ปี
ฉันไม่สามารถใช้วันที่และเวลาของระบบได้ ฉันต้องแยกวิเคราะห์ชื่อไฟล์ของข้อมูลสำรอง แต่สุดท้ายก็ระบุวันที่สำรองข้อมูลไว้
แนวทางของฉัน: เนื่องจากฉันไม่ทราบกำหนดการว่าการสำรองข้อมูลใดจะเกิดขึ้นในวันไหน ฉันจึงต้องทำงานกับช่วงเวลา ช่วงเวลา หรือแถบวันที่ ฉันจำเป็นต้องกำหนดอายุสัมพัทธ์ของข้อมูลสำรองหลังจากการสำรองข้อมูลครั้งที่ 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