Làm thế nào là bất biến vòng lặp thu được trong thuật toán tìm ràng buộc căn bậc hai này?


10

Ban đầu về math.SE nhưng chưa được trả lời.

Hãy xem xét các thuật toán sau.

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 

Trong đó u, v và n là các số nguyên và phép toán chia là phép chia số nguyên.

  • Giải thích những gì được tính toán bằng thuật toán.
  • Sử dụng câu trả lời của bạn cho phần I làm điều kiện hậu cho thuật toán, thiết lập một bất biến vòng lặp và chỉ ra rằng thuật toán chấm dứt và đúng.

Trong lớp, các bài điều kiện được tìm thấy là 0bạn2n<(bạn+1)2 và bất biến là 0bạn2n<v2,bạn+1v . Tôi không thực sự hiểu làm thế nào thu được sau điều kiện và bất biến. Tôi hình điều kiện bài là bạn+1= =v... đó rõ ràng không phải là trường hợp. Vì vậy, tôi tự hỏi làm thế nào thu được sau điều kiện và bất biến. Tôi cũng tự hỏi làm thế nào có thể đạt được điều kiện trước bằng cách sử dụng điều kiện sau.


Bạn có quen thuộc với logic Hoare không, và bạn có mong đợi một câu trả lời để chạm vào nó không?
Raphael

Câu trả lời:


8

Gilles nói đúng rằng kỹ thuật chung là đi câu cá cho những quan sát thú vị.

Trong trường hợp này, bạn có thể quan sát rằng chương trình là một phiên bản của tìm kiếm nhị phân, bởi vì nó có hình dạng sau:

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

Sau đó, bạn chỉ cần cắm vào cụ thể của bạn f, X... vào bất biến chung cho tìm kiếm nhị phân. Dijkstra có một cuộc thảo luận tốt đẹp về tìm kiếm nhị phân .


7

thực sự là một điều kiện hậu của vòng lặp while (tại sao bạn nghĩ rằng nó rõ ràng không phải là trường hợp?). Đây luôn là trường hợp với một vòng lặp while mà không chứa một: khi thoát vòng lặp, nó chỉ có thể là do điều kiện lặp (ở đây, u + 1 v ) là sai. Đây không phải là điều duy nhất đúng khi vòng lặp thoát ra ở đây (thuật toán này thực sự tính toán một điều thú vị, như bạn đã thấy trong lớp của mình, vì vậy u = [điều thú vị này] v = [điều thú vị này] cũng là điều kiện hậu ), nhưng nó là rõ ràng nhất.bạn+1= =vbreakbạn+1vbạn= =[điều thú vị này]v= =[điều thú vị này]

Bây giờ, để tìm các thuộc tính thú vị khác, không có công thức chung. Trong thực tế, có một số ý nghĩa chính thức trong đó không có công thức chung để tìm bất biến vòng lặp. Điều tốt nhất bạn có thể làm là áp dụng một số kỹ thuật chỉ hoạt động trong một số trường hợp, hoặc nói chung là đi câu cá cho những quan sát thú vị (hoạt động tốt hơn và tốt hơn khi bạn có nhiều kinh nghiệm hơn).

Nếu bạn chạy vòng lặp cho một vài lần lặp với một số giá trị , bạn sẽ thấy điều đó ở mỗi lần lặp:n

  • hoặc nhảy lên ( u + v ) / 2 ;bạn(bạn+v)/2
  • hoặc nhảy xuống ( u + v ) / 2 .v(bạn+v)/2

Cụ thể, bắt đầu ít hơn v , và sẽ không bao giờ vượt qua nó. Hơn nữa, u bắt đầu dương và tăng, trong khi v bắt đầu ở n + 1 và giảm. Vì vậy, 0 u v n + 1 là một bất biến trong suốt chương trình này.bạnvbạnvn+10bạnvn+1

Một điều không quá rõ ràng là liệu có thể bằng v . Điều đó quan trọng: nếu uv trở nên bằng nhau, chúng ta sẽ có x = u = v và vòng lặp sẽ tiếp tục tồn tại. Vì vậy, bạn cần chứng minh rằng uv không bao giờ trở nên bằng nhau để chứng minh rằng thuật toán là chính xác (nghĩa là không lặp mãi mãi). Khi nhu cầu này đã được xác định, thật dễ dàng để chứng minh (tôi sẽ bỏ qua điều này như một bài tập) rằng u < v là một bất biến vòng lặp (hãy nhớ rằng uv là các số nguyên, vì vậy điều này tương đương với bạnbạnvbạnvx= =bạn= =vbạnvbạn<vbạnvbạn+1v

v= =bạn+1bạn2n<v20bạn2nnn

  • bạnxv
  • khi , chúng ta chọn u tiếp theo là x , sao cho u 2n (và v không thay đổi);x2nbạnxbạn2nv
  • khi , chúng ta chọn v tiếp theo là x , sao cho n < v 2 (và bạn không thay đổi).x2>nvxn<v2bạn

Sự phân đôi này gợi ý rằng có thể . Nói cách khác, chúng tôi nghi ngờ rằng đó là một bất biến vòng lặp. Xác minh điều này được để lại như một bài tập cho người đọc (hãy nhớ kiểm tra xem tài sản đó có đúng ban đầu không).bạn2n<v2

Và bây giờ chúng ta đã thực hiện tất cả những điều này, chúng ta thấy rằng ( u + 1 ) 2 > n : u là căn bậc hai của n được làm tròn xuống số nguyên gần nhất.bạn2n(bạn+1)2>nbạnn


"Vì vậy, bạn cần chứng minh rằng u và v trở nên bằng nhau để chứng minh rằng thuật toán là chính xác" Tôi nghĩ rằng câu này thiếu "không".
sepp2k

@KenLi Vì đây là câu hỏi của bạn theo nghĩa Stack Exchange, bạn có muốn cải thiện cụ thể nào không?
Gilles 'SO- ngừng trở thành ác quỷ'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.