กระเป๋าที่ปรับปรุงการใช้พื้นที่
ยุบจากสองมิติให้เหลือแถวเดียว
กระเป๋าที่ปรับปรุงการใช้พื้นที่ เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่ต้องลดการใช้หน่วยความจำ
ตารางเต็มต้องใช้หน่วยความจำ n คูณ cap ซึ่งอาจเพิ่มขึ้นอย่างมากเมื่อข้อมูลนำเข้ามีขนาดใหญ่ การลดการใช้หน่วยความจำ จะลดลงเหลือแถวเดียวที่นำกลับมาใช้ซ้ำ
มีเพียงแถวสุดท้ายที่สำคัญ
สังเกตว่าแต่ละช่องอ่านเฉพาะ แถวก่อนหน้า และไม่อ่านข้อมูลที่เก่ากว่านั้นเลย ดังนั้นคุณจึงไม่จำเป็นต้องเก็บตารางทั้งหมดไว้พร้อมกัน
ลดเหลืออาร์เรย์เดียว
เก็บอาร์เรย์ dp เดียวที่มีความยาว cap+1 เมื่อประมวลผลสิ่งของแต่ละชิ้น ให้เขียนทับอาร์เรย์เดิมเพื่อแทนแถวใหม่
dp = [0] * (cap + 1)กับดักของการนำกลับมาใช้ซ้ำ
หากกวาดความจุจากซ้ายไปขวา dp[w - wt[i]] อาจถูกอัปเดตสำหรับสิ่งของชิ้นเดียวกันไปแล้ว ซึ่งจะทำให้คุณเลือกสิ่งของ i ได้ สองครั้ง
วนความจุย้อนกลับ
วิธีแก้คือวนความจุจากค่าสูงไปค่าต่ำ การวน ย้อนกลับ รับประกันว่า dp[w - wt[i]] ยังคงเก็บค่าจากรอบของสิ่งของก่อนหน้า
for w in range(cap, wt[i] - 1, -1):
dp[w] = max(dp[w], val[i] + dp[w - wt[i]])เหตุใดการวนย้อนกลับจึงใช้ได้
เมื่อคำนวณ dp[w] ดัชนีที่เล็กกว่าอย่าง w - wt[i] จะยัง ไม่ถูกเปลี่ยนแปลง ในรอบนี้ จึงยังสะท้อนค่าจากแถวด้านบนตามที่ต้องการ
หยุดที่น้ำหนักของสิ่งของ
ความจุที่น้อยกว่า wt[i] ไม่สามารถใส่สิ่งของชิ้นนี้ได้ ดังนั้นรอบวนซ้ำจึงหยุดที่ wt[i] การข้ามค่าดังกล่าวช่วยประหยัดรอบการทำงานที่ไม่จำเป็น
รอบวนซ้ำทั้งหมด
คำตอบทั้งหมดคือรอบวนซ้ำซ้อนกันสองชั้นบนอาร์เรย์เดียว วนสิ่งของด้านนอก วนความจุแบบ ย้อนกลับด้านใน แล้วคำตอบก็จะได้มาเอง
for i in range(n):
for w in range(cap, wt[i] - 1, -1):
dp[w] = max(dp[w], val[i] + dp[w - wt[i]])อ่านช่องสุดท้าย
หลังประมวลผลสิ่งของทั้งหมดแล้ว dp[cap] จะเก็บมูลค่าสูงสุดไว้ ซึ่งเป็นตัวเลขเดียวกับที่ตารางสองมิติจะให้ผลลัพธ์ เพียงใช้หน่วยความจำน้อยกว่ามาก
เวลาเท่าเดิม หน่วยความจำน้อยลง
คุณไม่ได้ทำให้อัลกอริทึมเร็วขึ้น แต่ยังคงใช้การทำงานในระดับ n คูณ cap คุณเพียงลดการใช้ หน่วยความจำ จากกำลังสองเหลือเชิงเส้น
เมื่อใดจึงคุ้มค่า
เทคนิคนี้ช่วยได้เมื่อ cap มีขนาดใหญ่และตารางสองมิติอาจใช้หน่วยความจำเกิน ขีดจำกัดหน่วยความจำ นี่เป็นเทคนิคพื้นฐานในการแข่งขันที่ควรจดจำ
ตรวจสอบอย่างรวดเร็ว
ทดสอบกฎสำคัญของปัญหากระเป๋าแบบ 1D
ทบทวน
คุณลดตารางสองมิติให้เหลืออาร์เรย์เดียว และวนความจุแบบ ย้อนกลับ เพื่อให้ถูกต้อง โดยแลกหน่วยความจำระดับกำลังสองกับเชิงเส้น 🚀
คำถามที่พบบ่อย
บทเรียน “กระเป๋าที่ปรับปรุงการใช้พื้นที่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กระเป๋าที่ปรับปรุงการใช้พื้นที่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กระเป๋าที่ปรับปรุงการใช้พื้นที่”
ยุบจากสองมิติให้เหลือแถวเดียว คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “กระเป๋าที่ปรับปรุงการใช้พื้นที่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กระเป๋า 0/1: เลือกหรือไม่เลือก
- กระเป๋าที่ปรับปรุงการใช้พื้นที่
- DP แบบไม่จำกัดจำนวนและการทอนเหรียญ
- ผลรวมเซตย่อยและการแบ่งส่วน