ภาพรวม
คำตอบที่เจฟฟ์ Shattock เป็นที่ถูกต้องที่นี้จะเทียบเท่า (หรือ isomorphic เป็นนักคณิตศาสตร์ที่เขียน) เป็นปัญหาการเพิ่มประสิทธิภาพ combinatorial แต่ก็เทียบเท่ากับ 1 มิติถังบรรจุปัญหาไม่ใช่ปัญหาเป้
โชคดีสำหรับคุณฉันมีรหัสที่จะแบ่งปันซึ่งจะช่วยแก้ปัญหานี้ให้คุณหรือคนอื่น ๆ ด้วยการเข้าถึงคอมพิวเตอร์ Windows ที่ติดตั้ง. NET Framework รุ่น 3.5 ขึ้นไปอย่างน้อย
โซลูชันที่หยาบ
ขั้นแรกให้ดาวน์โหลดและติดตั้งLinqPad
สองดาวน์โหลดแบบสอบถาม LINQPad ที่ฉันเพิ่งเขียน - นี่คือ linq (ha) ไปยังไฟล์ raw บันทึกเป็นไฟล์. linqและเปิดใน LINQPad
เปลี่ยนพารามิเตอร์:
นี่คือส่วนหนึ่งของรหัสสืบค้น LINQPad ที่คุณควรเปลี่ยน:
int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP.
string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";
เปลี่ยนbinSizeMb
เป็นขนาดของ 'bin' ของคุณเช่น CD, DVD, ex int binSizeMb = 650;
สำหรับซีดี
หมายเหตุ - The binSizeMb
มูลค่าถูกตีความว่าเป็นสิ่งที่บางครั้งเรียกว่าmebibyte ตรงกันข้ามกับวัยเด็กของฉันเมื่อทุกทวีคูณไบต์เป็น 'ไบนารี' บางครั้ง 'MB' ตอนนี้หมายถึง 'เมกะไบต์ทศนิยม' หรือ 1,000,000 ไบต์ตรงข้ามกับ 1,048,576 ไบต์ของ mebibyte (MiB) ซึ่งใช้ในรหัสของฉัน . หากคุณต้องการที่จะเปลี่ยนนี้เปลี่ยนสายในรหัสเพื่อconst int bytesPerMb = 1048576;
const int bytesPerMb = 1000000;
เปลี่ยนrootFileFolderPath
เป็นพา ธ เต็มของโฟลเดอร์ที่มีไฟล์ที่คุณต้องการ 'แพ็คเป็นถังขยะ' เช่น string rootFileFolderPath = @"C:\MySecretBinFilesFolder";
.
เรียกใช้แบบสอบถามโดยการกดปุ่มF5หรือคลิกปุ่มดำเนินการที่ด้านบนซ้ายของแท็บแบบสอบถาม
ผล
รหัสแบบสอบถามจะระบุไฟล์ทั้งหมดในrootFileFolderPath
โฟลเดอร์ซ้ำซ้ำซึ่งหมายความว่าจะรวมไฟล์ในโฟลเดอร์ย่อยทั้งหมดด้วย
จากนั้นจะสร้าง 'ถังขยะ' สำหรับไฟล์ที่ขนาดรวมของไฟล์ทั้งหมดในแต่ละถังน้อยกว่าหรือเท่ากับขนาดถังที่ระบุ
ในบานหน้าต่างผลลัพธ์ LINQPad คุณจะเห็นรายการสองรายการ
รายการแรกเป็นไฟล์ทั้งหมดที่พบซึ่งแสดงรายการตามลำดับที่ลดลงตามขนาด
รายการที่สองคือถังขยะที่สร้างขึ้นโดย 'การบรรจุไฟล์' พร้อมรายการไฟล์และขนาดรวมถึงขนาดที่เหลือของถังขยะ
ต่อไปนี้เป็นภาพหน้าจอที่แสดงรายการที่สองและสองช่องแรกที่สร้าง:
การวิเคราะห์เคอร์เซอร์
ตามวิกิพีเดียอัลกอริทึมที่ฉันใช้ - กลยุทธ์การลดความพอดีครั้งแรก (FFD) - ไม่ควรเลวร้ายเกินไป รัฐ Wikipedia:
ในปี 2550 ได้รับการพิสูจน์แล้วว่าขอบเขต 11/9 OPT + 6/9 สำหรับ FFD นั้นแน่น
'OPT' หมายถึงกลยุทธ์ที่ดีที่สุด (เป็นสิ่งที่อาจเข้าถึงไม่ได้ไม่ใช่กลยุทธ์จริงใด ๆ โดยเฉพาะ)
จากความทรงจำที่ค่อนข้างคลุมเครือของฉันของคำศัพท์ทางคณิตศาสตร์ที่เกี่ยวข้องนี้ควรหมายความว่ากลยุทธ์ FFD ควรบรรจุไอเท็มลงใน ~ 1.22 เท่าของจำนวนถังขยะที่กลยุทธ์ที่เหมาะสมที่สุด ดังนั้นกลยุทธ์นี้อาจบรรจุรายการเป็น 5 ถังขยะแทนที่จะเป็น 4 ฉันสงสัยว่าประสิทธิภาพจะใกล้เคียงกับความเหมาะสมที่สุดยกเว้นขนาดรายการ 'พยาธิวิทยา' ที่เฉพาะเจาะจง
บทความวิกิพีเดียเดียวกันยังระบุว่ามี"อัลกอริทึมที่แน่นอน" ฉันอาจตัดสินใจที่จะใช้สิ่งนั้นด้วย ฉันจะต้องอ่านกระดาษที่อธิบายอัลกอริทึมก่อน