メディアントを使用したブラケット検索の複雑さは何ですか?


8

Rekoデコンパイラー用に作成したアルゴリズムの複雑さを推定しようとしています。ここで、コンパイラーが定数による整数除算に行った変換を「取り消す」ようにしています。コンパイラーは除算を整数の乗算とシフトに変換しました:、ここではコンピューターのマシンワードのビット数です。結果の定数乗算は、ほとんどの現代的なアーキテクチャでの除算よりもはるかに高速ですが、元のコードに似ていません。X * 2 β / N > > β βx/n(x2β/n)>>ββ

説明するには:Cステートメント

y = x / 10;

Microsoft Visual C ++コンパイラによって、次のアセンブリ言語にコンパイルされます

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

最終的な結果は、レジスタeaxyソースコードからの期待値を持つようになることです。

素朴な逆コンパイラは上記を逆コンパイルします

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

しかし、Rekoは、元の除算で使用されていた定数を復元することにより、結果の出力を読みやすくすることを目指しています。

上記で示唆されたアルゴリズムは、Wikipediaのこの記事の説明に基づいています。まず、アルゴリズムは定数乗数をスケーリングされた逆数として扱います。これは、浮動小数点数への変換を、次いでによってそれをダウンスケーリングに、。最後の高価なステップは、2つの有理数、(0/1と1/1で始まる)の間の浮動小数点値、値を繰り返し計算することです。2β/n2 β R F 0.0 < RのF < 1.0 R F / B 、C / D +のC /B + D のR のR F2βrf2βrf0.0<rf<1.0rfa/bc/d a+c/b+dいくつかの収束基準に達するまで。結果は、逆数に対する「最良の」有理近似になります。rrf

ここで、ブラケット0/2と間で始まり、中点を計算する一般的なバイナリ検索でブラケットが行われていた場合、アルゴリズムがステップで収束することを期待しています。しかし、代わりにメディアントが使用されている場合、アルゴリズムの複雑さはどうなりますか?0/2β2β/2β a/b+c/d/2Oβ


@DW「元に戻す」の意味を説明するために質問を編集しました
JohnKällén16年

ありがとう!それはあなたの特定の質問への答えではありませんが、継続的な分数に精通していますか?これらは、与えられた浮動小数点数の適切な有理近似を見つけるもう1つの方法です。それらは非常に効率的であり、私はそれらがあなたの設定でうまく機能するのではないかと考えています(「非常に良い」の適切な定義に対して、「非常に良い」すべての有理近似を見つけるため)。
DW

@DW私は継続分数に少しだけ精通しています。O(log n)の解に収束する近似アルゴリズムはありますか?
JohnKällén16年

回答:


4

Stern–BrocotツリーとFareyシーケンスの間の関係は、かつp q = 1(つまり、p / qは縮小分数)の場合、p / qq番目のレベルにあることを示しています木の。アルゴリズムの実行期間は終了するレベルで線形であるため、アルゴリズムには時間がかかりますO q 。ここで、p / qが答えです。しかし、これはあまり役に立ちません。0<p/q<1(p,q)=1p/qp/qqO(q)p/q

あなたの停止基準が何であるかを指定していないが、おそらくあなたは、いくつかのエラーしきい値持って。したがって、問題は、隣接する項が最大2 ϵの距離にある場合(したがって、すべての点は、ある点からϵの距離にある)の場合、どのFareyシーケンスかということになります。Fareyシーケンスの隣接する分数p 1 / q 1p 2 / q 2間の距離が1 /q 1 q 2であるという事実を使用して、q番目のFareyシーケンスでの最大距離を示すことは難しくありませんですϵ2ϵϵp1/q1,p2/q21/q1q2q。したがって、 ϵの距離を狙っている場合、最悪の場合、アルゴリズムは時間 O 1 / ϵ で実行されます。1/qϵO(1/ϵ)

ただし、番目のファレイシーケンスの「最も」隣接する部分は距離O 1 / q 2にあるため、平均してO qO(1/q2)(残念ながら、この平均はアルゴリズムではなく入力に関するものです)。O(1/ϵ)


したがって、中点がO(sqrt(1 / e))として収束する一方で、中点はO(log1 / e)として収束するように見えます。残念です。
JohnKällén16年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.