Sự phức tạp của một tìm kiếm trong ngoặc sử dụng mediants là gì?


8

Tôi đang cố gắng ước tính độ phức tạp của thuật toán mà tôi đã viết cho trình dịch ngược Reko , trong đó tôi đang cố gắng "hoàn tác" thông tin được trình biên dịch thực hiện thành một phép chia số nguyên theo hằng số . Trình biên dịch đã chuyển bộ phận thành một nhân số nguyên và một sự thay đổi: ( x * 2 β / n ) > > β , nơi β là số bit của từ máy của máy tính. Phép nhân hằng số kết quả nhanh hơn rất nhiều so với phép chia trong hầu hết các kiến ​​trúc đương đại, nhưng không còn giống với mã gốc.x/n(x2β/n)>>ββ

Để minh họa: câu lệnh C

y = x / 10;

sẽ được trình biên dịch Microsoft Visual C ++ biên dịch theo ngôn ngữ lắp ráp

mov edx,1999999Ah  ; load 1/10 * 2^32 
imul eax           ; edx:eax = dividend / 10 * 2 ^32 
mov eax,edx        ; eax = dividend / 10

Kết quả cuối cùng là thanh ghi eaxbây giờ sẽ có giá trị mong đợi ytừ mã nguồn.

Một trình dịch ngược ngây thơ sẽ dịch ngược phần trên thành

eax = ((long)eax * 0x1999999A) >> 32;

nhưng Reko nhằm mục đích làm cho đầu ra kết quả dễ đọc hơn bằng cách khôi phục hằng số được sử dụng trong phân chia ban đầu.

Thuật toán gợi ý ở trên dựa trên mô tả về bài viết này trong Wikipedia . Đầu tiên, thuật toán xử lý hệ số nhân không đổi theo tỷ lệ nghịch đảo . Nó chuyển đổi đó đến một điểm nổi số 2 β r f và sau đó quy mô nó xuống bằng 2 β để r f , nơi 0,0 < r f < 1,0 . Bước cuối cùng, tốn kém là đặt giá trị dấu phẩy động r f giữa hai số hữu tỷ a / b , c / d2β/n2βrf2βrf0.0<rf<1.0rfa/bc/d(bắt đầu bằng 0/1 và 1/1) và liên tục tính toán mediant cho đến khi đạt được một số tiêu chí hội tụ. Kết quả sẽ là "tốt nhất" hợp lý xấp xỉ r nghịch đảo r f .(a+c)/(b+d)rrf

Bây giờ, nếu bracketing đã được thực hiện với một tìm kiếm nhị phân thông thường bắt đầu từ giữa rationals 2 β / 2 β , và tính toán điểm giữa ( một / b + c / d ) / 2 , tôi hy vọng các thuật toán để hội tụ trong các bước O ( β ) . Nhưng sự phức tạp của thuật toán là gì nếu phương tiện được sử dụng thay thế?0/2β2β/2β (a/b+c/d)/2O(β)


@DW Tôi đã chỉnh sửa câu hỏi để giải thích ý của tôi với "hoàn tác"
John Källén

Cảm ơn! Đây không phải là câu trả lời cho câu hỏi cụ thể của bạn, nhưng bạn có quen thuộc với các phân số tiếp tục không? Chúng là một cách khác để tìm một xấp xỉ hợp lý tốt cho một số dấu phẩy động nhất định. Chúng rất hiệu quả và tôi nghi ngờ chúng có thể hoạt động tốt trong cài đặt của bạn (vì chúng tìm thấy tất cả các xấp xỉ hợp lý "rất tốt", cho một số định nghĩa phù hợp về "rất tốt").
DW

@DW Tôi chỉ hơi quen với các phân số tiếp tục. Có một thuật toán gần đúng hội tụ về một giải pháp trong O (log n) không?
John Källén

Câu trả lời:


4

0<p/q<1(p,q)=1p/qp/qqO(q)p/q

ϵ2ϵϵp1/q1,p2/q21/(q1q2)q1/qϵO(1/ϵ)

qO(1/q2)O(1/ϵ)


Vì vậy, nó có vẻ như là điểm giữa hội tụ là O (log1 / e) trong khi mediants hội tụ là O (sqrt (1 / e)). Thật thất vọng.
John Källén
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.