Domanda

Considerare la funzione di conteggio $ \ {x \} ^ * \ Right Docka \ MathBB N $ che conta il numero di occorrenze del simbolo $ x $ .

Sono confuso sulla complessità (asintotica) di calcolo di questa funzione, dove l'output deve essere rappresentato in un sistema non unirisco (ad esempio, binario) . La mia intuizione suggerisce fortemente che questo dovrebbe essere lineare, cioè, $ o (n) $ dove $ n $ è il numero di occorrenze del simbolo $ x $ nell'input.

Per quanto riguarda la mia comprensione ci sono molteplici interpretazioni del calcolo - E.G.,

    .
  • Macchine per la tentazione a banda singola, per la quale la mia migliore idea ha tempo di esecuzione $ \ omega (n ^ 2 \ log n) $ penso (la classe $ \ log n $ proviene dall'assunzione che la funzione del successore binario ha $ \ omega (n) $ tempo di esecuzione, dove $ N $ è la lunghezza di una rappresentazione binaria di un numero naturale e la $ n ^ 2 $ viene dal presupposto che la macchina di tentazione deve viaggiare su tutta la $ x $ 's per raggiungere il suo conteggio corrente),
  • Multi-band Turing Machines, per il quale penso di avere un'idea di tempo di esecuzione $ \ omega (n \ log n) $ ,
  • Macchine a accesso casuale, che non conosco affatto.

Quindi la mia domanda è la seguente.

Qual è la complessità computazionale della funzione di conteggio nei vari modelli di calcolo? È lineare in nessuno di loro?

Se a tutti i pertinenti, chiedo dal punto di vista dell'algebra astratta, dove sto cercando di valutare la complessità computazionale del problema della parola in un gruppo specifico.

È stato utile?

Soluzione

Turing Machines sono un bel modello con diversi vantaggi, per lo più la loro semplicità, ma non sono la prima scelta quando analizzano gli algoritmi. Gli algoritmi sono tipicamente analizzati implicitamente sul modello della macchina della RAM, e in alcuni casi, su Modello BSS .

Ecco alcuni commenti sulla complessità computazionale del conteggio in vari modelli:

Macchina Turing a nastro singolo: Questi sono considerati solo poiché è relativamente facile dimostrare limiti inferiori su di loro. Sono ancora meno realistici di un modello di calcolo rispetto alle macchine Turing multi-nastri.

Macchina Turing multi-nastro: È un esempio standard in complessità ammortizzata che un contatore crescente può essere implementato utilizzando $ o (1) $ Operazioni di bit ammortizzate. Questo perché metà del tempo, solo un bit cambia, un quarto del tempo, solo due bit, e così via, per un numero totale di bit modificati che è $ 1/2 + 2 / 4 + 3/8 + \ Cdots= 2 $ . La complessità della macchina di Turing è lineare in questo, e quindi il conteggio può essere implementato in $ o (n) $ .

RAM macchina: Una macchina RAM è costituita da un registro finalmente e a una memoria di accesso casuale. I registri sono $ o (\ log n) $ -bits long, dove $ n $ è la dimensione dell'ingresso. Le operazioni ragionevoli sui registri prendono un tempo costante. In particolare, aumentando un contatore che può contare fino a $ \ mathit {poly} (n) $ prende $ o (1 ) $ caso peggiore tempo. In particolare, la tua funzione eseguirà in $ o (n) $ .

BSS Machine: Uno deve fare attenzione quando si esegue l'aritmetica su numeri di grandi dimensioni. Sulla macchina RAM, l'aritmetica richiede un tempo costante solo se la grandezza degli operandi è $ \ mathit {poly} (n) $ . Una macchina BSS consente l'accesso a registri speciali che memorizzano valori in alcuni campi, dicono i numeri reali. Puoi eseguire aritmetici e confronti a tempo costante, ma non funziona come il pavimento. Non è consentito anche utilizzare tali valori per l'indicizzazione. (Se non ti limiti abbastanza, presto ti risolverai seduto in tempo polinomiale.) Puoi pensare a una macchina BSS come accogliere le operazioni di flottanti, che in pratica prendono un tempo costante, ignorando la precisione finita coinvolta in loro .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top