ค่าคงที่ของลูปที่ได้ในอัลกอริธึมการค้นหาขอบเขตสแควร์รูทเป็นอย่างไร?


10

มีพื้นเพมาจากmath.SEแต่ยังไม่มีคำตอบ

พิจารณาอัลกอริทึมต่อไปนี้

u := 0
v := n+1;
while ( (u + 1) is not equal to v) do
   x :=  (u + v) / 2;
   if ( x * x <= n) 
     u := x;
   else
     v := x;
   end_if
end_while 

โดยที่ u, v และ n เป็นจำนวนเต็มและการดำเนินการหารคือการหารจำนวนเต็ม

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

ในชั้นเรียนสภาพโพสต์พบว่าเป็นและค่าคงที่คือ . ฉันไม่เข้าใจจริงๆเกี่ยวกับวิธีการได้รับเงื่อนไขและค่าคงที่ ฉันคิดว่าเงื่อนไขการโพสต์คือ ... ซึ่งไม่ชัดเจนในกรณีนี้ ดังนั้นฉันจึงสงสัยว่าจะได้รับโพสต์เงื่อนไขและค่าคงที่ได้อย่างไร ฉันยังสงสัยว่าจะสามารถรับเงื่อนไขล่วงหน้าได้อย่างไรโดยใช้เงื่อนไขโพสต์0u2n<(u+1)20u2n<v2,u+1vu+1=v


คุณคุ้นเคยกับตรรกะของ Hoare หรือไม่และคุณคาดหวังคำตอบที่จะแตะหรือไม่?
Raphael

คำตอบ:


8

Gilles พูดถูกว่าเทคนิคทั่วไปคือการตกปลาเพื่อการสังเกตที่น่าสนใจ

ในกรณีนี้คุณอาจสังเกตว่าโปรแกรมเป็นตัวอย่างของการค้นหาแบบไบนารีเนื่องจากมีรูปร่างดังต่อไปนี้:

while i + 1 != k
  j := strictly_between(i, k)
  if f(j) <= X then i := j
  if f(j) > X then k := j

จากนั้นคุณเพียงแค่เสียบโดยเฉพาะอย่างยิ่งของคุณf, X... เข้าสู่คงทั่วไปสำหรับการค้นหาแบบทวิภาค Dijkstra มีการสนทนาที่ดีของการค้นหาแบบทวิภาค


7

u+1=vเป็นโพสต์เงื่อนไขของลูป while (ทำไมคุณถึงคิดว่ามัน“ ชัดเจน” ไม่ใช่ในกรณี?) นี่เป็นกรณีที่มี while while ที่ไม่มี a break: เสมอเมื่อออกจาก loop มันอาจเป็นเพราะเงื่อนไข loop (ที่นี่ ) เป็นเท็จ มันไม่ใช่สิ่งเดียวที่จะเป็นจริงเมื่อลูปออกจากที่นี่ (อัลกอริทึมนี้คำนวณสิ่งที่น่าสนใจอย่างที่คุณเห็นในชั้นเรียนของคุณดังนั้นและก็โพสต์เงื่อนไข) แต่ก็ชัดเจนที่สุดu+1vu=[this interesting thing]v=[this interesting thing]

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

หากคุณวนซ้ำสองสามครั้งโดยมีค่าคุณจะเห็นว่าในการวนซ้ำแต่ละครั้ง:n

  • ทั้งกระโดดขึ้นไป ;u(u+v)/2
  • หรือกระโดดลงไป 2v(u+v)/2

โดยเฉพาะอย่างยิ่งเริ่มน้อยกว่าและจะไม่มีวันแซงหน้ามัน นอกจากนี้เริ่มเป็นบวกและเพิ่มขึ้นขณะที่เริ่มต้นที่และลดลง ดังนั้นจึงเป็นค่าคงที่ตลอดโปรแกรมนี้uvuvn+10uvn+1

สิ่งหนึ่งที่ไม่ชัดเจนมากนักคือว่าสามารถเท่ากับหรือไม่ นั่นเป็นสิ่งสำคัญ: หากและเท่ากันเราจะมีและวนรอบจะดำเนินต่อไปเรื่อย ๆ ดังนั้นคุณต้องพิสูจน์ว่าและไม่เท่ากันเพื่อพิสูจน์ว่าอัลกอริทึมนั้นถูกต้อง (เช่นไม่วนซ้ำตลอดไป) เมื่อความต้องการนี้ได้รับการพิสูจน์แล้วมันเป็นเรื่องง่ายที่จะพิสูจน์ (ฉันออกจากเรื่องนี้เป็นแบบฝึกหัด) ว่าเป็นค่าคงที่แบบวนรอบ (โปรดจำไว้ว่าและเป็นจำนวนเต็มดังนั้นนี่จึงเท่ากับ )uvuvx=u=vuvu<vuvu+1v

เนื่องจากที่ส่วนท้ายของโปรแกรมโพสต์เงื่อนไขที่คุณได้รับยังสามารถเขียนได้ (ส่วนที่เป็นเรื่องเล็กน้อย) เหตุผลที่เราต้องการให้โพสต์ในสภาพเช่นนี้เกี่ยวข้องกับคือว่าเราต้องการที่จะผูกผลของโปรแกรมที่มีการป้อนข้อมูลที่nทำไมสภาพที่แม่นยำนี้ เรากำลังมองหาบางสิ่งที่แม่นยำที่สุดเท่าที่จะเป็นไปได้และเราจะดูว่ามีปรากฎในลูป:v=u+1u2n<v20u2nnn

  • เรามี ;uxv
  • เมื่อเราเลือกต่อไปเป็นดังนั้น (และไม่เปลี่ยนแปลง);u x u 2n vx2nuxu2nv
  • เมื่อเราเลือกถัดไปเป็นดังนั้น (และจะไม่เปลี่ยนแปลง)v x n < v 2 ux2>nvxn<v2u

การแบ่งขั้วนี้บอกเป็นนัย ๆ ว่าบางทีตลอดเวลา กล่าวอีกนัยหนึ่งเราสงสัยว่ามันเป็นค่าคงที่แบบวนซ้ำ การตรวจสอบสิ่งนี้ถูกทิ้งไว้เป็นแบบฝึกหัดให้กับผู้อ่าน (อย่าลืมตรวจสอบว่าคุณสมบัตินั้นเป็นจริงในตอนแรก)u2n<v2

และตอนนี้เราได้ทำสิ่งนี้เสร็จแล้วเราจะเห็นว่าและ :คือรากที่สองของปัดเศษลงเป็นจำนวนเต็มที่ใกล้ที่สุด( u + 1 ) 2 > n u nu2n(u+1)2>nun


"คุณต้องพิสูจน์ว่า u และ v มีค่าเท่ากันเพื่อพิสูจน์ว่าอัลกอริทึมนั้นถูกต้อง" ฉันคิดว่าประโยคนี้ไม่มี "ไม่"
sepp2k

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