0Pricing
Coding Interview Prep · บทเรียน

กระเป๋าที่ปรับปรุงการใช้พื้นที่

ยุบจากสองมิติให้เหลือแถวเดียว

กระเป๋าที่ปรับปรุงการใช้พื้นที่ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. กระเป๋า 0/1: เลือกหรือไม่เลือก
  2. กระเป๋าที่ปรับปรุงการใช้พื้นที่
  3. DP แบบไม่จำกัดจำนวนและการทอนเหรียญ
  4. ผลรวมเซตย่อยและการแบ่งส่วน
← กลับไปที่ Coding Interview Prep