analisi del tempo dell'algoritmo "dimensione input" vs "elementi input"


13

Sono ancora un po 'confuso con i termini "lunghezza dell'input" e "dimensione dell'input" quando usato per analizzare e descrivere il limite superiore asintomatico per un algoritmo

Sembra che la lunghezza di input per l'algoritmo dipenda molto dal tipo di dati e dall'algoritmo di cui stai parlando.

Alcuni autori fanno riferimento alla lunghezza dell'input per la dimensione dei caratteri richiesti per rappresentare l'input, quindi "abcde" se l'uso come input impostato in un algoritmo avrà una "lunghezza dell'input" di 6 caratteri.

Se al posto dei caratteri abbiamo un numero (numeri interi per esempio), a volte viene utilizzata la rappresentazione binaria anziché i caratteri, quindi la "lunghezza di input" viene calcolata come (essendo L il numero massimo nel set di input).Nlog(L)

Esistono altri problemi che, anche se l'insieme di input è costituito da numeri, descrivono la "lunghezza di input" come "variabili di decisione", quindi per un set di input di lunghezza N con numeri nell'intervallo la lunghezza di input è solo N (somma del sottoinsieme per esempio), o ancor più complicare il numero di valori binari di posizione necessari per affermare il problema (ciò che ritengo sia lo stesso di ) N * l o g ( L )0232Nlog(L)

Così:

  • dipende dall'algoritmo?
  • Cosa significa e quando utilizzare ogni "versione" di lunghezza di input
  • Esistono regole che posso usare per decidere quale usare?

Risposte:


10

Nel senso più formale, la dimensione dell'input viene misurata in riferimento all'implementazione di Turing Machine dell'algoritmo ed è il numero di simboli alfabetici necessari per codificare l'input.

Questo è ovviamente piuttosto astratto, ed è molto difficile lavorare in pratica, o almeno molto fastidioso - dovremmo considerare come andremo a specificare delimitatori ecc. Ecc. Ciò che accade normalmente in pratica è che cerchiamo una misura proxy della dimensione dell'input - qualcosa di più conveniente e accessibile, ma ciò non causa problemi matematici nella nostra analisi.

Usando il tuo esempio "abcde", di solito l'alfabeto che usiamo per l'input è piccolo, quindi anche usando la misura proxy di caratteri, sappiamo che anche su una Turing Machine, possiamo, se ci disturbiamo, specifica una codifica di input che converta "abcde" in una forma codificata che abbia una lunghezza al massimo di per una costante . Questa espansione di una costante in genere non farebbe alcuna differenza nella nostra analisi asintotica, poiché eliminiamo regolarmente i fattori costanti.5 × c c55×c c

In un caso diverso, spesso misuriamo la dimensione di un grafico di input per il numero di vertici . Chiaramente se vogliamo specificare grafici arbitrariamente grandi, la dimensione dell'input codificato non è semplicemente - cosa è successo ai bordi, per esempio? Quello che sappiamo è che possiamo usare uno schema di codifica ragionevole che rappresenta il grafico in bit. Si tratta di un'espansione un po 'più che costante, ma in molti casi interessanti, abbiamo a che fare solo con una granularità di polinomi, e i polinomi compongono bene in molti modi - in particolare, ad esempio, se determiniamo che il nostro tempo di esecuzione è dove è un polinomio, quindi sappiamo che esiste un polinomion N = c n 2 log n O ( p ( n ) ) p p O ( p ( n ) ) = O ( p ( N ) )nnN=cn2lognO(p(n))pp' tale che , quindi quando torniamo alla misura formale dell'input, siamo ancora in tempo polinomiale.O(p(n))=O(p'(N))

Un posto in cui questo potrebbe cadere è quando si lavora con i numeri. Poiché un numero con magnitudine può essere codificato in bit, se il nostro tempo di esecuzione fosse , questo sarebbe - esponenziale nella dimensione di input effettiva - che renderebbe la grandezza una cattiva scelta per un proxy per le dimensioni di input se volessimo parlare dell'appartenenza a per esempio (quando si arriva a Strongly- -completo e debolmente- -completo, ricordalo). D'altra parte, se tutto ciò a cui eravamo interessati fosse la decidibilità, allora sarebbe una misura delega abbastanza buona.n = O ( log m ) O ( m ) O ( 2 n ) m P N P N Pmn=O(logm)O(m)O(2n)mPNPNP

Pertanto, sebbene non vi siano regole stabilite per la scelta di una misura proxy per la dimensione di input, il requisito è che l'espansione o la contrazione della dimensione del proxy rispetto alla dimensione di input sia compatibile con ciò che si sta tentando di dimostrare. Come regola generale, i cambiamenti costanti dei fattori non contano quasi mai, i piccoli fattori polinomiali vanno normalmente bene e funzionano per la maggior parte della teoria di base che vedi, i grandi fattori polinomiali potrebbero ancora funzionare per la teoria, ma può essere una brutta sorpresa nella pratica, e quantità esponenziali di cambiamento sono normalmente troppo estreme.


Grazie per la risposta. Davvero interessante la parte in cui parli della selezione del proxy giusto per parlare dell'appartenenza a P o NP per l'input, che potrebbe essere una nuova domanda completa! Oltre a ciò, e tornando alla prima domanda. Quale secondo te sarebbe quindi il miglior proxy per un algoritmo che il suo input è un insieme di numeri interi? Immagino che forse dipenderà dall'algoritmo? Vedo 3 potenziali opzioni: N (essendo la lunghezza del set) N * Log (L) (L è il valore massimo) e Log (Sum (set)).
Jesus Salas,

@JesusSalas, può sicuramente dipendere da cosa ci fai con loro, ma sarebbe la risposta "abbastanza vicina alla codifica TM", ma può comunque essere interessante guardare il tempo di esecuzione in termini di , o forse e l'entità del numero più grande - ovviamente questo è solo , ma a volte può essere più semplice analizzare le cose con misure non ovvie. N N 2 log LNlogLNN 2logL
Luke Mathieson,

Questo copre le basi ma ci sono alcune imprecisioni. La rappresentazione di "abcde" su una macchina Turing non richiede caratteri: ci vogliono cinque caratteri se scegli l'alfabeto giusto. E non hai bisogno di bit per rappresentare un grafico -vertex: la matrice di adiacenza è esattamente bit. c n 2 log n n n 25ccn2lognnn2
David Richerby,

Forse quando usare N o N log L potrebbe dipendere dal costo per l'algoritmo di operare su ciascun elemento di input. Immagino che se supponiamo che l'algoritmo usi un tempo costante per fare il suo lavoro su ciascun elemento di input indipendentemente dalla sua dimensione in bit (e questo non è abusato), allora N è probabilmente quello giusto, risultando in O (N) . D'altra parte se la dimensione dell'elemento di input in bit aumenta il costo dell'operazione, allora N log L sembra più accurato poiché dovremmo esprimere nel limite superiore quali proprietà dell'input sono coinvolte nella crescita
Jesus Salas,

@DavidRicherby sì, se riesci a scegliere l'alfabeto ci vogliono simboli, ma questo è proprio dove , se per altri motivi abbiamo un alfabeto diverso, diciamo binario, visto che è molto più utile poter dire che può codificare tutto in binario senza perdita di generalità, quindi , ma è facile e interessante vedere che è relativamente facile farlo con qualsiasi alfabeto non insano all'interno di un fattore costante di . Inoltre, vero, potresti non aver bisogno di bit , ma è un limite superiore piuttosto robusto che può gestire entrambe le codifiche normali. c = 1 c = log 2 5 5 O ( n 2 log n )5c=1c=log255 O(n2logn)
Luke Mathieson,

8

Dipende dal tuo modello di calcolo e anche sfortunatamente a volte dall'algoritmo stesso.

  • Se il tuo modello di calcolo è una macchina di Turing , la dimensione dell'input è il numero di celle occupate dall'input. Quindi, se il tuo input è l'input ha lunghezza 6.un'Bun'Bcd
  • Se il tuo modello è la RAM, la dimensione dell'input è il numero di registri / celle di memoria in cui l'input inizialmente rimane. Questo potrebbe essere usato in modo improprio poiché potresti tecnicamente scrivere l'intero input in un registro. Tuttavia, i calcoli sono più costosi se si utilizza il modello dei costi logaritmici.
  • Se il tuo modello di calcolo è una word-RAM , allora conti anche le celle di memoria, ma possono solo memorizzare interi -bit, poiché è un parametro del tuo modello.www

Tuttavia, molti algoritmi non vengono misurati rispetto alla dimensione di input "effettiva". Quindi devi guardare attentamente a cosa si riferisce la dichiarazione dell'analisi.

  • Spesso hai un presupposto implicito con il problema. Quando si dice che ci vuole tempo per ordinare elementi allora si assume che due oggetti possano essere confrontati in tempo . Ovviamente se ordini, dì stringhe molto lunghe, quindi potrebbe non essere vero.O(nlogn)nO(1)n
  • Per motivi convenzionali, a volte si misura rispetto a un diverso parametro dell'input. Ad esempio, la moltiplicazione delle matrici viene in genere analizzata per moltiplicare due matrici.n×n

Qualche regola: usa quello che vuoi, ma chiariscilo nella dichiarazione del risultato. Quindi dì solo cosa esattamente , se esiste la possibilità di incomprensioni.n


1
nO(n3)nn
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.