Complessità temporale dell'addizione


11

Wikipedia elenca la complessità temporale dell'addizione come , dove è il numero di bit.nn

È un limite inferiore teorico rigido? O è solo la complessità dell'attuale algoritmo più veloce conosciuto. Voglio sapere, perché la complessità dell'aggiunta, sottolinea tutte le altre operazioni aritmetiche e tutti gli algoritmi che le usano.

È teoricamente impossibile ottenere un algoritmo di addizione che gira in ? Oppure siamo vincolati alla complessità lineare per l'aggiunta.o(n)

Risposte:


17

Se il tuo algoritmo utilizza asintoticamente meno di volte, non ha abbastanza tempo per leggere tutte le cifre dei numeri che sta aggiungendo. Devi immaginare di gestire numeri molto grandi (memorizzati ad esempio in file di testo da 8 MB). Naturalmente, l'aggiunta può essere fatta molto rapidamente rispetto al valore dei numeri; viene eseguito in tempo, se è il valore della somma.nO(log(N))N

Questo non significa che puoi accelerare un po 'le cose; se il tuo processore gestisce 32 bit per operazione, allora usi tempo, ma è comunque e non .n32O(n)o(n)


Sta leggendo tutti i dati teoricamente necessari. Per aggiunta di due numeri e . Il calcolo di , può essere eseguito in modalità , tramite spostamento. Aggiungendo uno . Considera che. Potrebbe non trovare una stima più rapida per la somma, perfezionare quella stima fino a quando non è corretta. In meno di operazioni? un'b,a:ab,a+b2a2un'O(1)0n
Tobi Alafin,

3
Sì, è una necessità teorica, perché: ogni bit dell'input viene utilizzato in modo non banale nell'output , dove per non banale intendo che non è la funzione identità. Nel tuo esempio , se può essere calcolato nel tempo dipende dal modello computazionale: se aggiungere uno è un'operazione a tempo costante, allora sì. Se si dispone dell'accesso alla RAM, è necessario il tempo per scrivere l'indirizzo del bit se si conosce già la lunghezza di , o tempo se si deve leggere tutto per scoprirlo. In questo esempio , molti bit di uscita sono funzioni banali di bit di ingresso. 2un'2un'O(1)0O(log(n))un'O(n)un'2un'
Lieuwe Vinkhuijzen il

Ho un algoritmo che trova la lunghezza di in O ( log n ) . Usa la ricerca binaria. un'O(logn)
Tobi Alafin,

3
@TobiAlafin Se il modello supporta l'indirizzamento RAM, la ricerca binaria viene eseguita in fasi , corretto. Su Turing Machine e in un file di testo non caricato nella memoria principale, questo richiede tempo O ( n ) . In entrambi i casi, per rispondere alla tua domanda, con o senza indirizzamento RAM per velocizzare la ricerca, il tuo algoritmo dovrà esaminare tutti i bit dell'input per calcolare a + b . Supponiamo che non lo sia, e su un input di 42 bit, non ispeziona il 6 ° bit. Quindi potrei capovolgerlo e darebbe la risposta sbagliata. O(logn)O(n)a+B426
Lieuwe Vinkhuijzen,

1
Fondamentalmente tutte le operazioni sono , per questo motivo. L'unica eccezione è se hai a che fare con una struttura di dati in qualche modo ordinata: ad esempio non devi visitare un intero BST per verificare se contiene un certo valore, ma questo è vero solo a causa degli invarianti che arrivano con il BST. Ω(n)
Bakuriu,

7

Affinché l'analisi della complessità abbia un senso formale, è necessario specificare un modello computazionale formale all'interno del quale viene eseguito l'algoritmo nell'oggetto, o almeno un modello di costo , che specifica quali sono le operazioni di base e i loro costi.

Nella maggior parte dei contesti, si presume che le operazioni aritmetiche richiedano tempo. Questo è generalmente ragionevole, poiché siamo interessati alla complessità algoritmica indipendentemente dai numeri coinvolti. Questo è chiamato il modello di costo uniforme .Θ(1)

Se i numeri possono crescere senza limiti o se siamo interessati ad analizzare le operazioni stesse, si presume che le operazioni aritmetiche abbiano un costo , proporzionale alla dimensione dell'input.Θ(|X|)

Ora, le operazioni possono avere un costo inferiore? Forse, tuttavia, dovrai definire formalmente un modello computazionale in cui può accadere.


1
A titolo di ulteriore esempio, un carry look-ahead vipera prende, in virtù di specifiche assunzioni semplificatrici, il tempo per calcolare la somma di due n -bit numeri. Θ(logn)n
Fabio Somenzi,

3

L'input per l'aggiunta è di due numeri arbitrari . Poiché sono arbitrari, è necessario leggere ogni bit, quindi l'algoritmo è .Ω(n)

Immagina che il tuo algoritmo aggiunga con successo 1010100110 e 0010010110 senza leggere ogni bit. Affinché il tuo algoritmo sia in grado di aggiungere input arbitrari , dovrei essere in grado di capovolgere casualmente uno di questi bit e l'algoritmo emette comunque un'aggiunta corretta (ma diversa). Ma se il tuo algoritmo non legge tutti i bit, come potrebbe dire che l'input capovolto era diverso dall'input originale?


n

Assolutamente. Devi solo definire cosa significa "approssimativo" nel tuo algoritmo. A seconda di tale definizione, l'aggiunta dei due bit più significativi potrebbe essere una somma approssimativa, che potrebbe essere eseguita in o (n) tempo. Quando menzioni l'algoritmo di "addizione", penso che lo consideriamo tutti per indicare che la risposta deve essere esatta.
murrdpirate,
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.