ตัวอย่างของอัลกอริทึมและการพิสูจน์ที่ดูเหมือนถูกต้อง แต่ไม่ใช่


15

ในบทนำของฉันเกี่ยวกับหลักสูตรการเขียนโปรแกรมเรากำลังเรียนรู้เกี่ยวกับวิธีการเริ่มต้น - การบำรุงรักษา - การสิ้นสุดการพิสูจน์อัลกอริทึมทำในสิ่งที่เราคาดหวัง แต่เราต้องพิสูจน์ว่าอัลกอริทึมที่ทราบแล้วว่าถูกต้องนั้นถูกต้อง เราไม่เคยถูกขอให้แสดงว่าอัลกอริทึมไม่ถูกต้อง

มีตัวอย่างคลาสสิกของอัลกอริทึมที่ดูถูกต้อง แต่ใช่ไหม? ฉันกำลังมองหากรณีที่วิธีการเริ่มต้น - บำรุงรักษา - สิ้นสุดการจับสิ่งที่สัญชาตญาณแรกไม่ได้


5
อาจเป็นไปได้ที่น่าสนใจ: cs.stackexchange.com/q/29475/755
DW

5
Upvoting เพราะฉันคิดว่านี่เป็นคำถามที่สำคัญมาก มันอยู่นอกขอบเขตเล็กน้อยสำหรับ cstheory แต่ฉันไม่รู้แพลตฟอร์มที่ดีกว่าสำหรับมันและมีผู้สอนอัลกอริทึมมากมายในชุมชน cstheory หลักสูตรการออกแบบอัลกอริทึมส่วนใหญ่เปิดโปงให้นักเรียนเห็นว่าถูกต้องเท่านั้นอัลกอริธึมที่มีอยู่และปัญหาที่แก้ไขได้อย่างง่ายดายโดยใช้เทคนิคที่รู้จัก สิ่งนี้ตอกย้ำความประทับใจและน่าดึงดูดใจสำหรับนักเรียนว่าเราสามารถเชื่อมั่นในความรู้สึกที่เป็นธรรมชาติของอัลกอรึธึมได้อย่างปลอดภัย หลักสูตรการออกแบบอัลกอริทึมที่ดีควรทำในสิ่งที่ตรงกันข้าม!
Neal Young

3
ฉันชอบที่จะมีชุดสะสมเช่นนี้
จันทรา Chekuri

คำตอบ:


20

สูงสุด 2 มิติในท้องถิ่น

การป้อนข้อมูล: 2 มิติอาร์เรย์n×nA

เอาต์พุต:ค่าสูงสุดในพื้นที่ - คู่ที่ A [ i , j ]ไม่มีเซลล์ข้างเคียงในอาร์เรย์ที่มีค่าที่ใหญ่กว่าอย่างเคร่งครัด (i,j)A[i,j]

(เซลล์เพื่อนบ้านคือเซลล์ที่มีอยู่ในอาร์เรย์) ตัวอย่างเช่นถ้าAคือA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

จากนั้นแต่ละเซลล์ที่มีตัวหนาจะมีค่าสูงสุดในท้องถิ่น ทุกอาร์เรย์ที่ไม่ว่างจะมีค่าสูงสุดอย่างน้อยหนึ่งค่า

ขั้นตอนวิธี มีอัลกอริทึม - เวลา: เพียงตรวจสอบแต่ละเซลล์ นี่คือแนวคิดสำหรับอัลกอริทึมที่เร็วกว่าแบบเรียกซ้ำได้O(n2)

รับ , กำหนด cross Xเพื่อให้ประกอบด้วยเซลล์ในคอลัมน์กลางและเซลล์ในแถวกลาง แรกตรวจสอบแต่ละเซลล์ในXเพื่อดูว่ามือถือเป็นสูงสุดในท้องถิ่น หากเป็นเช่นนั้นให้ส่งคืนเซลล์ดังกล่าว มิฉะนั้นให้( i , j )เป็นเซลล์ในXด้วยค่าสูงสุด เนื่องจาก( i , j )ไม่ใช่ค่าสูงสุดในท้องถิ่นจึงต้องมีเซลล์ใกล้เคียง( i , j ) ที่มีค่ามากกว่าAXXA(i,j)X(i,j)(i,j)

พาร์ติชัน (อาเรย์A , ลบเซลล์ในX ) ออกเป็นสี่ส่วน - ซ้ายบน, ขวาบน, ซ้ายล่างและ quadrants ขวาล่าง - ตามธรรมชาติ เซลล์ข้างเคียง( i , j ) ที่มีค่ามากกว่าจะต้องเป็นหนึ่งในจตุภาคนั้น เรียกว่าวอด' AXAX(i,j)A

บทแทรก Quadrant 'มีสูงสุดในท้องถิ่นของAA

พิสูจน์ พิจารณาเริ่มต้นที่เซลล์ ) หากไม่ใช่ค่าสูงสุดในท้องถิ่นให้ย้ายไปยังเพื่อนบ้านที่มีค่ามากกว่า สามารถทำซ้ำได้จนกว่าจะถึงเซลล์ที่มีค่าสูงสุดในพื้นที่ ว่าเซลล์สุดท้ายจะต้องมีใน'เพราะ'เป็นที่สิ้นสุดในทุกด้านโดยเซลล์ที่มีค่ามีขนาดเล็กกว่าค่าของเซลล์( ฉัน' , J ' ) สิ่งนี้พิสูจน์บทแทรก (i,j)AA(i,j)

อัลกอริทึมเรียกตัวเองซ้ำใน sub-arrayAเพื่อค้นหาค่าสูงสุดในพื้นที่(i,j) ที่นั่นจากนั้นส่งคืนเซลล์นั้นn2×n2A(i,j)

เวลาทำงานสำหรับn × nตอบสนองเมทริกซ์T ( n ) = T ( n / 2 ) + O ( n )ดังนั้นT ( n ) = O ( n ) T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

ดังนั้นเราได้พิสูจน์ทฤษฎีบทต่อไปนี้:

ทฤษฎีบท. มีความเป็นเรียลไทม์อัลกอริทึมสำหรับการค้นหาในท้องถิ่นสูงสุดในn × nอาร์เรย์O(n)n×n

หรือว่าพวกเรา


เมื่ออ่านครั้งแรกข้อผิดพลาดเดียวที่ฉันเห็นคือโซลูชันการเกิดซ้ำ นั่นเป็นความผิดพลาดเพียงอย่างเดียวเหรอ?
Radu GRIGore

1
การเกิดซ้ำนั้นถูกต้อง อัลกอริทึมไม่ได้!
Neal Young

1
อ๊ะใช่ฉันทำผิดพลาดเป็นใบ้กับการเกิดซ้ำ ฉันเห็นปัญหา: จำนวนสูงสุดที่คุณพิสูจน์มีอยู่ไม่ใช่สิ่งที่คุณต้องการ และสิ่งที่คุณมองข้ามคือ X.
Radu GRIGore

3
(2143300101230001023002222222333233300323000032300)

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