Apa kompleksitas pencarian yang diberi tanda kurung menggunakan mediant?

8

Saya mencoba memperkirakan kompleksitas suatu algoritma yang saya tulis untuk dekompiler Reko , di mana saya mencoba untuk "membatalkan" tranformasi yang dilakukan oleh kompiler ke divisi integer oleh konstantax/n. Kompiler telah mengubah divisi menjadi perkalian integer dan pergeseran:(x2β/n)>>βdimana βadalah jumlah bit kata mesin komputer. Perkalian konstan yang dihasilkan jauh lebih cepat daripada pembagian di sebagian besar arsitektur kontemporer, tetapi tidak lagi menyerupai kode asli.

Untuk menggambarkan: pernyataan C.

y = x / 10;

akan dikompilasi oleh kompiler Microsoft Visual C ++ ke bahasa assembly berikut

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

Hasil akhirnya adalah register eaxsekarang akan memiliki nilai yang diharapkan dari ykode sumber.

Decompiler naif akan mendekompilasi di atas ke

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

tetapi Reko bertujuan untuk membuat output yang dihasilkan lebih terbaca dari itu dengan memulihkan konstanta yang digunakan di divisi asli.

Algoritma yang diisyaratkan di atas didasarkan pada deskripsi pada artikel ini di Wikipedia . Pertama, algoritma memperlakukan pengali konstan sebagai timbal balik yang diskalakan2β/n. Itu mengubahnya menjadi angka floating point2βrf dan kemudian skala turun 2β untuk rfdimana 0.0<rf<1.0. Langkah terakhir yang mahal adalah mengurung nilai floating pointrf antara dua bilangan rasional a/b, c/d(dimulai dengan 0/1 dan 1/1) dan berulang kali menghitung perantara (a+c)/(b+d)sampai beberapa kriteria konvergensi tercapai. Hasilnya harus menjadi pendekatan rasional "terbaik"r untuk timbal balik rf.

Sekarang, jika bracketing sedang dilakukan dengan pencarian biner yang khas dimulai antara rasional 0/2β dan 2β/2β, dan menghitung titik tengah (a/b+c/d)/2, Saya berharap algoritma akan menyatu O(β)Langkah. Tapi apa kompleksitas algoritma jika mediant digunakan sebagai gantinya?

John Källén
sumber
@DW Saya telah mengedit pertanyaan untuk menjelaskan apa yang saya maksud dengan "undo"
John Källén
Terima kasih! Ini bukan jawaban untuk pertanyaan spesifik Anda, tetapi apakah Anda terbiasa dengan pecahan lanjutan? Mereka adalah cara lain untuk menemukan perkiraan rasional yang baik untuk angka floating-point yang diberikan. Mereka sangat efisien, dan saya kira mereka mungkin bekerja dengan baik di pengaturan Anda (karena mereka menemukan semua perkiraan rasional "sangat bagus", untuk beberapa definisi yang cocok dari "sangat baik").
DW
@ WD Saya hanya sedikit akrab dengan pecahan yang berkelanjutan. Apakah ada algoritma perkiraan yang menyatu pada solusi di O (log n)?
John Källén

Jawaban:

4

Hubungan antara pohon Stern-Brocot dan urutan Farey menunjukkan bahwa jika 0<p/q<1 dan (p,q)=1 (yaitu, p/q adalah fraksi yang berkurang) p/q ada di qtingkat pohon. Karena jangka waktu menjalankan algoritma Anda linear pada tingkat di mana Anda mengakhiri, algoritma Anda membutuhkan waktuO(q)dimana p/qadalah jawabannya; tapi ini tidak begitu membantu.

Anda belum menentukan kriteria berhenti Anda, tetapi mungkin Anda memiliki beberapa ambang kesalahan ϵ. Oleh karena itu pertanyaannya adalah untuk urutan Farey apakah kasus istilah yang paling jauh jaraknya2ϵ (dan setiap titik berada jauh ϵdari beberapa titik). Menggunakan fakta bahwa jarak antara fraksi yang berdekatanp1/q1,p2/q2 dalam urutan Farey adalah 1/(q1q2), tidak sulit untuk menunjukkan bahwa jarak maksimal pada qUrutan Farey adalah 1/q. Karena itu jika Anda membidik jarakϵ, maka algoritma Anda akan berjalan dalam waktu O(1/ϵ) dalam kasus terburuk.

Namun, "sebagian besar" fraksi yang berdekatan di qUrutan Farey berada di kejauhan O(1/q2), dan rata-rata Anda mungkin mengharapkan waktu berjalan HAI(1/ϵ) (sayangnya, rata-rata ini berkaitan dengan input daripada algoritma).

Yuval Filmus
sumber
Jadi sepertinya titik tengah konvergen sebagai O (log1 / e) sementara mediant konvergen sebagai O (sqrt (1 / e)). Sangat mengecewakan.
John Källén