อัลกอริธึมการหมุนสำรองทางเลือก Java

ฉันเป็นมือใหม่ในโลกแห่งอัลกอริธึมการหมุน ฉันจำเป็นต้องปรับปรุงอัลกอริธึมการสำรองข้อมูลที่มีอยู่แล้วซึ่งเขียนด้วยภาษา 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


person gllo    schedule 30.09.2014    source แหล่งที่มา


คำตอบ (1)


ตอบคำถามของฉันเอง

เพื่อที่จะใช้อัลกอริธึม ฉันใส่รายการจำนวนเต็มลงใน 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 ฉันสามารถเชื่อมโยงกับวันที่ที่จะเก็บรักษาไว้ได้ ตามลำดับ และจากวันที่ที่ฉันสามารถเชื่อมโยงกลับไปยังชื่อไฟล์และตัดสินใจว่าจะเก็บรักษาใดและควรลบใดในการหมุนเวียนที่กำหนด

person gllo    schedule 03.10.2014