0Pricing
Competitive Programming Academy · บทเรียน

ตรวจจับวัฏจักรในการจำลอง

ข้ามไปข้างหน้าเมื่อสถานะเกิดซ้ำ

ตรวจจับวัฏจักรในการจำลอง เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

เมื่อขั้นตอนเกิดซ้ำ

การจำลองบางข้อถามหาสถานะหลังจากทำขั้นตอนจำนวน มหาศาล เช่น หนึ่งล้านล้านครั้ง การทำทีละขั้นจะไม่มีวันเสร็จทันเวลา ⏳

สถานะมีจำนวนจำกัด

หากจำนวน สถานะ ที่เป็นไปได้มีจำกัด การจำลองจะต้องกลับมาเจอสถานะเดิมในที่สุด จากจุดนั้นสถานะจะวนซ้ำไปตลอด

ลักษณะของวัฏจักร

เส้นทางมี ช่วงหาง ที่นำเข้าสู่วัฏจักร แล้วมีวงวนที่เกิดซ้ำ การมองเห็นวงวนช่วยให้ข้ามขั้นตอนนับพันล้านขั้นไปได้อย่างรวดเร็ว

จำจุดที่เคยผ่าน

เก็บแต่ละสถานะไว้ใน พจนานุกรม โดยจับคู่กับหมายเลขขั้นตอนที่พบสถานะนั้นเป็นครั้งแรก การพบสถานะเดิมอีกครั้งจะเผยให้เห็นวัฏจักร

seen = {}

ตรวจจับการเกิดซ้ำ

ก่อนแต่ละขั้น ให้ตรวจสอบว่าสถานะปัจจุบันอยู่ใน รายการที่พบแล้ว หรือไม่ หากอยู่ แสดงว่าคุณเพิ่งปิดวัฏจักรลง

if state in seen:
    start = seen[state]

วัดความยาววัฏจักร

ความยาว คือขั้นตอนปัจจุบันลบด้วยขั้นตอนที่คุณพบสถานะนี้เป็นครั้งแรก จำนวนขั้นตอนดังกล่าวจะพาสถานะกลับมายังจุดเดิมพอดี

length = step - seen[state]

ข้ามไปข้างหน้าด้วยโมดูโล

ลบช่วงหางออก แล้วนำจำนวนขั้นตอนที่เหลือไป หารเอาเศษด้วยความยาววัฏจักร จากนั้นคุณจะจำลองเพียงส่วนที่เหลือขนาดเล็กเท่านั้น

rem = (N - start) % length

ทำขั้นตอนที่เหลือให้เสร็จ

จำลองต่ออีกเพียงขั้นตอน ที่เหลือจากจุดเริ่มต้นของวัฏจักร สถานะสุดท้ายจะตรงกับสถานะเมื่อถึงขั้นตอน N พอดี

for _ in range(rem):
    state = step_fn(state)

รักษาสถานะให้แฮชได้

คีย์ของพจนานุกรมต้อง แฮชได้ ดังนั้นให้เปลี่ยนรายการเป็นทูเพิลก่อนจัดเก็บ สถานะที่เปลี่ยนแปลงได้จะใช้เป็นคีย์ไม่ได้

key = tuple(row)

Floyd โดยไม่ใช้หน่วยความจำ

หากสถานะใหญ่เกินกว่าจะจัดเก็บ อัลกอริทึมเต่าและกระต่ายของ Floyd จะค้นหาวัฏจักรโดยใช้ตัวชี้สองตัวและหน่วยความจำเพิ่มเติมเพียงเล็กน้อย

เหตุผลที่วิธีนี้ช่วยได้

การตรวจจับวัฏจักรเปลี่ยนวงวนที่มีขั้นตอนหนึ่งล้านล้านครั้งซึ่ง เป็นไปไม่ได้ ให้เหลือเพียงไม่กี่พันขั้น การมองเห็นการเกิดซ้ำคือเคล็ดลับทั้งหมด

ตรวจสอบอย่างรวดเร็ว

คุณพบสถานะปัจจุบันเป็นครั้งแรกที่ขั้นตอน s และตอนนี้อยู่ที่ขั้นตอน t

สรุป

เมื่อสถานะเกิดซ้ำ ให้บันทึกแต่ละสถานะใน ตารางจับคู่ หาความยาววัฏจักร ข้ามไปข้างหน้าด้วยการหารเอาเศษ และจำลองเฉพาะขั้นตอนที่เหลือ 🚀

คำถามที่พบบ่อย

บทเรียน “ตรวจจับวัฏจักรในการจำลอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตรวจจับวัฏจักรในการจำลอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตรวจจับวัฏจักรในการจำลอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม

ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. จำลองสถานะและก้าวไปข้างหน้า
  2. การเดินบนกริดและเวกเตอร์ทิศทาง
  3. ตรวจจับวัฏจักรในการจำลอง
  4. รับมือกรณีขอบที่ซับซ้อน
← กลับไปที่ Competitive Programming Academy