Qual è la complessità di una ricerca tra parentesi che utilizza mediant?


8

Sto cercando di stimare la complessità di un algoritmo che ho scritto per il decompilatore Reko , in cui sto cercando di "annullare" la trasformazione eseguita da un compilatore in una divisione intera di una costante . Il compilatore ha convertito la divisione in una moltiplicazione intera e uno spostamento: , dove è il numero di bit della parola macchina del computer. La moltiplicazione costante risultante è molto più veloce di una divisione nella maggior parte delle architetture contemporanee, ma non assomiglia più al codice originale.X/n(X*2β/n)>>ββ

Per illustrare: la dichiarazione C.

y = x / 10;

verrà compilato dal compilatore Microsoft Visual C ++ nel seguente linguaggio assembly

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

Il risultato netto è che il registro eaxavrà ora il valore atteso ydal codice sorgente.

Un ingenuo decompilatore decompilerà quanto sopra

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

ma Reko mira a rendere l'output risultante più leggibile di quello recuperando la costante utilizzata nella divisione originale.

L'algoritmo accennato sopra si basa sulla descrizione di questo articolo su Wikipedia . Innanzitutto, l'algoritmo considera il moltiplicatore costante come il reciproco ridimensionato . Lo converte in un numero a virgola mobile e quindi lo ridimensiona di in , dove . Il passaggio finale, costoso, è di racchiudere il valore in virgola mobile tra due numeri razionali , (a partire da 0/1 e 1/1) e calcolare ripetutamente il mediante2β/n2βrf2βrf0.0<rf<1.0rfun'/Bc/d (un'+c)/(B+d)fino a quando non viene raggiunto un criterio di convergenza. Il risultato dovrebbe essere il "migliore" approssimazione razionale al reciproco .rrf

Ora, se il bracketing veniva eseguito con una tipica ricerca binaria che iniziava tra le razionali e e calcolava il punto medio , Mi aspetto che l'algoritmo converga in passaggi . Ma qual è la complessità dell'algoritmo se si utilizza invece la mediant?0/2β2β/2β (un'/B+c/d)/2O(β)


@DW Ho modificato la domanda per spiegare cosa intendo con "annulla"
John Källén

Grazie! Non è una risposta alla tua domanda specifica, ma hai familiarità con le frazioni continue? Sono un altro modo per trovare una buona approssimazione razionale a un dato numero in virgola mobile. Sono molto efficienti e sospetto che potrebbero funzionare bene nel tuo ambiente (poiché trovano tutte le approssimazioni razionali "molto buone", per una definizione adeguata di "molto buono").
DW

@DW Conosco solo leggermente le frazioni continue. Esiste un algoritmo di approssimazione che converge su una soluzione in O (log n)?
John Källén,

Risposte:


4

La relazione tra l'albero Stern – Brocot e le sequenze Farey mostra che if 0<p/q<1 e (p,q)=1 (Cioè, p/q è una frazione ridotta) quindi p/q è al qth livello dell'albero. Poiché il termine corrente dell'algoritmo è lineare al livello in cui si termina, l'algoritmo richiede tempoO(q), dove p/qè la risposta; ma questo non è così utile.

Non hai specificato quale sia il tuo criterio di arresto, ma presumibilmente hai qualche soglia di errore ε. La domanda quindi è per quale sequenza di Farey è il caso che i termini adiacenti siano al massimo a distanza2ε (e quindi ogni punto è a distanza εda qualche punto). Utilizzando il fatto che la distanza tra le frazioni adiacentip1/q1,p2/q2 in una sequenza Farey è 1/(q1q2), non è difficile dimostrare che la distanza massima al qla sequenza Farey è 1/q. Pertanto se stai mirando a una distanza diε, quindi il tuo algoritmo verrà eseguito in tempo O(1/ε) Nel peggiore dei casi.

Tuttavia, la maggior parte delle frazioni adiacenti al qla sequenza Farey è a distanza O(1/q2), e quindi in media probabilmente ti aspetteresti un tempo di esecuzione di O(1/ε) (sfortunatamente, questa media è rispetto all'input piuttosto che all'algoritmo).


Quindi sembra che il punto medio converge come O (log1 / e) mentre i medianti convergono come O (sqrt (1 / e)). Che deludente.
John Källén,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.