การแก้เขาวงกตจำนวนกระโดด


18

เด็กอายุ 8 ปีของฉันเบื่อหน่ายกับการสร้างเขาวงกตแบบดั้งเดิมและได้นำไปสร้างสายพันธุ์ที่มีลักษณะดังนี้:

ตัวอย่างจำนวนกระโดด

ความคิดคือการเริ่มต้นจาก x และเข้าถึง o ผ่านกฎปกติ นอกจากนี้คุณสามารถ "กระโดด" จากจำนวนเต็มไปยังจำนวนเต็มอื่น ๆได้ แต่คุณต้องจ่ายดอลลาร์สำหรับสิทธิพิเศษ เป้าหมายคือการแก้เขาวงกตในราคาที่ถูกที่สุด ในตัวอย่างข้างต้นเราสามารถเปลี่ยนจาก x เป็น o ผ่าน x-14-18-27-28-o ในราคา 5 แต่มันถูกกว่าที่จะไป x-13-11-9-8-29-28-o เท่านั้น 4ab|ab|

ดังนั้นนี่คือคำถามของฉัน: อะไรคือทางออกที่ดีที่สุด (ในแง่ของเวลาทำงานเชิงซีมโทติค) คุณสามารถคิดถึงการแก้ปัญหานี้ คุณอาจกำหนดสมมติฐานที่สมเหตุสมผลเกี่ยวกับรูปแบบการป้อนข้อมูล

หมายเหตุ:ฉันกำลังใช้แท็ก "ปริศนา" ที่นี่เพราะฉันมีคำตอบในใจ แต่ฉันไม่แน่ใจว่ามันเป็นวิธีที่ดีที่สุดและต้องการดูว่ามีใครบางคนสามารถปรับปรุงวิธีการแก้ปัญหาของฉัน (นี่คือจำนวนของจำนวนเต็มในเขาวงกต.)O(n2)n


7
อุปกรณ์ประกอบฉากให้กับลูกของคุณสำหรับการสร้างปริศนาความคิดสร้างสรรค์และคณิตศาสตร์!
bbejot

2
@bjjot คุณควรเห็นบางสิ่งที่เขาถามฉัน ... บางครั้งฉันไม่สามารถตอบคำถามของเขาได้ เช่นmath.stackexchange.com/questions/33094/…
Fixee

1
ฉันไม่แน่ใจว่าการคำนวณต้นทุนของคุณถูกต้อง X-14-18-27-28-o ควรค่าใช้จ่ายและ x-13-11-9-8-29-28-o ควรค่าใช้จ่าย27 4+9+1=142+2+1+21+1=27
Dave Clarke

1
@Dave ไม่ได้มีการเปลี่ยนแปลงทั้งหมดที่กระโดด เราสามารถเขียน 'ab' สำหรับการกระโดด (ซึ่งมีราคา ) และ 'a-> b' สำหรับการเดินในกราฟจาก a ถึง b (ซึ่งมีค่า ) ซึ่งอนุญาตเฉพาะเมื่อ พวกเขาสามารถเข้าถึงได้โดยไม่ทำลายกำแพงในเขาวงกต ในสัญกรณ์นี้เรามี x-> 14-18-> 27-28-> o และค่าใช้จ่าย 5 และ x-> 13-11-> 9-8-> 29-28-> o ฉัน Thin Fixee ไม่แนะนำสัญกรณ์นี้เนื่องจากมันซ้ำซ้อน: ไม่มีเหตุผลที่จะกระโดดสองครั้งจึงกระโดดและเดินในเขาวงกตจะสลับกัน 0|ab|0
Artem Kaznatcheev

2
นี่เป็นปัญหาการบ้านที่ยอดเยี่ยม!
Jeffε

คำตอบ:


15

คุณสามารถแก้ปัญหานี้ได้ในเวลาโดยใช้อัลกอริทึมของ Dijkstra เราสามารถออกไปได้โดยไม่ทำการอัปเดตทางไกลทั้งหมดเมื่อเราไปที่โหนดใหม่ หากเราไปที่โหนดyเราต้องการเพียงอัปเดตระยะทางของทุกสิ่งที่สามารถเดินได้จากyเป็น 0 และเพื่ออัปเดตระยะทางไปยังโหนดทั้งสองy -และy +ด้วยค่าที่ใกล้เคียงกับyน้อยกว่าและมากกว่าyซึ่งไม่ ถูกเลือกแล้วO(nlogn)yyyy+yy

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

แต่ละโหนดจะได้รับการอัปเดตเป็น 0 มากที่สุด (ถ้าเราเปิดโหนศูนย์ระยะไกลทั้งหมดจากคิวเพื่อหลีกเลี่ยงพฤติกรรมสมการกำลังสอง) และทุกครั้งที่เราเพิ่มโหนดเราจะทำการอัปเดตอื่น ๆ ของ O (1) เท่านั้น การค้นหาค่าและy +สามารถทำได้ในเวลาเชิงเส้นถ้าเรายังเก็บรายการที่เชื่อมโยงเป็นสองเท่าของลำดับของโหนดทั้งหมดเรียงลำดับตามค่าจำนวนเต็ม การสร้างรายการที่เชื่อมโยงเป็นทวีคูณนี้ใช้เวลาO ( n log n )และสุดท้ายO ( n )จะอัปเดตและปรากฏจาก heap ใช้เวลาO ( n log n )สำหรับรันไทม์ทั้งหมดของO (yy+O(nlogn)O(n)O(nlogn)O(nlogn)


สิ่งนี้สามารถปรับปรุงได้เล็กน้อยโดยใช้การเรียงลำดับและลำดับความสำคัญซึ่งเป็นพิเศษสำหรับจำนวนเต็ม แต่คุณไม่สามารถทำได้ดีกว่าการเรียงลำดับจำนวนเต็มดังที่เห็นได้จากการลดลงต่อไปนี้: หากเรามีรายการค่าจำนวนเต็ม , ตั้งค่าxให้น้อยที่สุดเป็นสองเท่าของค่าเหล่านี้และoเป็นค่าสูงสุดสองเท่า สร้างพื้นที่ที่มีค่า2 x ฉันและ2 x ฉัน + 1สำหรับแต่ละอื่น ๆxฉัน ทางออกที่ดีที่สุดจะผ่านแต่ละภูมิภาคในการเรียงลำดับโดยx iและทำให้เกิดการเรียงลำดับของx1,,xnxo2xi2xi+1xixiค่า x i xi
เดฟ

เดฟถูกต้องสามารถลดเป็นโดยการอัปเดตy +และy -เท่านั้น นอกจากนี้แทนที่จะเชื่อมต่อทุกโหนดในพื้นที่กับทุก ๆ โหนดในพื้นที่พวกเขาจะต้องเชื่อมต่อกับ 1 หรือ 2 โหนดอื่น ๆ ในภูมิภาค (ทำเส้นทาง) ดังนั้นแต่ละโหนดมีได้ถึง 4 ขอบเท่านั้น จากนั้นอัลกอริทึมของ Dijkstra (มีคิวนาทีลำดับความสำคัญ) อาจใช้การอนุญาตให้O ( n ลิตรกรัมn )เวลา O(nlgn)y+yO(nlgn)
bbejot

@bbejot: แต่ถ้าเป็นเช่นนั้นแล้วคิวลำดับความสำคัญที่สมบูรณ์โดย Thorup จะไม่ปรับปรุงเวลาในการทำงานเป็นหรือแม้แต่O ( n )ด้วยเทคนิคการจัดเก็บข้อมูลเพิ่มเติมภายใต้สถานการณ์ที่ไม่ได้กำหนดเส้นทางหรือไม่? O(nloglogn)O(n)
Hsien-Chih Chang 張顯之

4

ฉันรู้สึกว่าอาจเป็นสิ่งที่ดีที่สุดที่คุณจะได้รับO(n2)

ดูเหมือนเป็นเรื่องธรรมดาที่จะแปลงสิ่งนี้ให้เป็นปัญหาเส้นทางที่สั้นที่สุดด้วยโหนดเริ่มต้นพิเศษ (x) และโหนดสิ้นสุด (0) จะมีอีกหนึ่งโหนดสำหรับแต่ละหมายเลข ทั้ง x และ 0 มีขอบของน้ำหนัก 0 ถึงโหนดจำนวนทั้งหมดซึ่งสามารถเข้าถึงได้ในเขาวงกต โหนดตัวเลขทั้งหมดเชื่อมต่อกับน้ำหนัก 0 (หากตัวเลขสามารถเข้าถึงเขาวงกตได้) หรือกับความแตกต่างระหว่างตัวเลข (หากไม่สามารถเข้าถึงเขาวงกตได้)

เส้นทางที่สั้นที่สุดในกราฟนี้ไม่สามารถแก้ไขได้ในน้อยกว่าเนื่องจากกราฟมีขอบประมาณn 2และในกรณีที่เลวร้ายที่สุดจะต้องดูทุกกรณีทันที ดังนั้นอัลกอริทึม Dijkstra'a สำหรับเส้นทางที่สั้นที่สุดใช้เวลาO ( n 2 )และเป็นกรณีที่แย่ที่สุดO(n2)n2O(n2)


นี่คือคำตอบที่ฉันมีอยู่ในใจ แน่นอนคุณต้องใช้โครงสร้างข้อมูลที่เหมาะสมด้วยวิธี Dijkstra ที่จะได้รับเวลาในการทำงาน การใช้กองไบนารีโดยทั่วไปจะให้ผลผลิตO ( n 2 LG n ) O(n2)O(n2lgn)
Fixee

1
rO(r2)

O(nlogn)O(r2+nlogn)Ω(nlogn)

Ω(n2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.