สร้างเซตย่อยทั้งหมด
เลือกหรือข้ามแต่ละสมาชิก
สร้างเซตย่อยทั้งหมด เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่ต้องสร้างเซตย่อย
โจทย์การแข่งขันจำนวนมากขอให้ลองเซตย่อยทุกเซตของเซตขนาดเล็ก การเรียกซ้ำช่วยให้แสดงรายการทั้งหมดได้อย่างเป็นระเบียบและเชื่อถือได้ 🧩
เลือกหรือข้ามสมาชิกแต่ละตัว
แนวคิดหลักคือ สำหรับสมาชิกแต่ละตัว ให้สร้างทางเลือกแบบไบนารีหนึ่งครั้งว่าจะรวมสมาชิกนั้นไว้หรือไม่นำมารวม ทางเลือกครบทุกชุดจะให้เซตย่อยหนึ่งเซต
มีเซตย่อยกี่เซต
เซตที่มีสมาชิก n ตัวจะมี2 ยกกำลัง n เซตย่อยพอดี เพราะสมาชิกแต่ละตัวทำให้จำนวนเพิ่มเป็นสองเท่า ดังนั้นควรรักษา n ให้เล็ก ประมาณ 20 หรือน้อยกว่า
แผนการเรียกซ้ำ
เลื่อนดัชนีไปตามอาร์เรย์ ที่แต่ละดัชนีให้แตกกิ่งสองทาง ได้แก่ เลือกสมาชิกหนึ่งทาง และข้ามสมาชิกอีกทาง
กรณีฐาน
เมื่อดัชนีเลยสมาชิกตัวสุดท้าย เส้นทางปัจจุบันคือเซตย่อยที่สมบูรณ์หนึ่งเซต ช่วงเวลานั้นคือกรณีฐานสำหรับบันทึกเซตย่อย
การเรียกซ้ำเพื่อสร้างเซตย่อยในโค้ด
การไล่สำรวจแบบเรียกซ้ำนี้บันทึกเซตย่อยที่จุดสิ้นสุด แล้วสำรวจทางเลือกข้ามและเลือกจากแต่ละดัชนี
def gen(i, cur):
if i == len(a):
out.append(cur[:])
return
gen(i + 1, cur)
gen(i + 1, cur + [a[i]])ย้อนกลับด้วยการยกเลิกการเลือก
เมื่อใช้ append เพื่อเพิ่มสมาชิก ให้ลบสมาชิกนั้นออกหลังการเรียกซ้ำ เพื่อให้กิ่งถัดไปเริ่มต้นอย่างสะอาด ขั้นตอนการยกเลิกนี้คือหัวใจของการย้อนกลับ
cur.append(a[i])
gen(i + 1, cur)
cur.pop()ทางเลือกแบบบิตมาสก์
นอกจากนี้ยังสามารถจับคู่จำนวนเต็มแต่ละจำนวนตั้งแต่ 0 ถึง 2 ยกกำลัง n ลบ 1 กับเซตย่อยหนึ่งเซต โดยให้แต่ละบิตระบุว่าสมาชิกตัวใดถูกรวมไว้
for mask in range(1 << n):
sub = [a[i] for i in range(n) if mask >> i & 1]ทำสำเนาก่อนจัดเก็บ
จัดเก็บสำเนาของรายการปัจจุบันเสมอ ไม่ใช่ตัวรายการเอง มิฉะนั้นการเปลี่ยนแปลงภายหลังจะเขียนทับเซตย่อยทุกเซตที่บันทึกไว้ ⚠️
การสร้าง combinations
หากต้องการเซตย่อยที่มีขนาดคงที่ k ให้หยุดกิ่งเมื่อจำนวนสมาชิกที่เลือกถึง k วิธีนี้จะเปลี่ยนการสร้างเซตย่อยให้เป็นการสร้าง combinations
เซตย่อยปรากฏในงานใดบ้าง
การแจกแจงเซตย่อยใช้แก้ปัญหากระเป๋าเป้ขนาดเล็ก การเลือกทีม และการตรวจสอบความเป็นไปได้ที่ต้องทดสอบตัวเลือกทุกแบบ
ตรวจสอบความเข้าใจ
เซตที่มีสมาชิก n ตัวจะมีเซตย่อยกี่เซต
สรุปทบทวน: แตกกิ่งที่สมาชิกทุกตัว
ได้เรียนรู้การแสดงรายการเซตย่อยทั้งหมดด้วยการเลือกหรือข้ามสมาชิกแต่ละตัว และยกเลิกการเลือกหลังแต่ละกิ่ง ควรรักษา n ให้เล็ก เพราะจำนวนเซตคือ 2 ยกกำลัง n 🎯
คำถามที่พบบ่อย
บทเรียน “สร้างเซตย่อยทั้งหมด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สร้างเซตย่อยทั้งหมด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Competitive Programming Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สร้างเซตย่อยทั้งหมด”
เลือกหรือข้ามแต่ละสมาชิก คุณปฏิบัติ Competitive Programming Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Competitive Programming Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Competitive Programming Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “สร้างเซตย่อยทั้งหมด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม
ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คิดแบบเวียนเกิด: ฐานและการเรียกซ้ำ
- สร้างเซตย่อยทั้งหมด
- การเรียงสับเปลี่ยนและแนวคิด N-Queens
- ตัดกิ่งเพื่อให้อยู่รอดในขีดจำกัดเวลา