Grandi divari tra RAM e complessità della macchina di Turing


9

Se consideriamo solo problemi in P, ci sono grandi lacune tra l'algoritmo word-RAM più veloce conosciuto e l'algoritmo Turing machine più veloce conosciuto per problemi particolari? Sono particolarmente interessato se vi sono ampie lacune per problemi naturali di interesse generale.


6
una macchina RAM può essere simulata da una macchina di Turing con sovraccarico di O(nlogn) in fase di esecuzione. Quindi non ci saranno grandi lacune.
Shaull,

@Shaull Esiste un divario di quelle dimensioni per qualsiasi problema naturale / popolare?
Lembik,

3
Palindrome impiega Ω(n2) tempo su una TM a nastro singolo (ed è O(n) nella RAM). eecs.yorku.ca/course_archive/2008-09/W/6115/palindrome.pdf
SamM,

6
Il commento di Shaull è vero solo per macchine non deterministiche e nell'impostazione TM a due nastri, per quanto ne so. Citazione, Shaull?
Ryan Williams,

1
@ qbt937 - Wow, che esplosione del passato :) Credo di non aver fornito una citazione perché non ne avevo una (né ne ho una ora), e potrebbe darsi che Ryan Williams abbia ragione.
Shaull

Risposte:


6

È noto che qualsiasi problema che è possibile calcolare su una macchina RAM nel tempo , è possibile farlo in una macchina di Turing in tempo al massimo T ( n ) 2 . Devi notare che la dimensione totale della memoria utilizzata non può essere superiore a T ( n ) , poiché ciò significherebbe che hai fatto più operazioni di scrittura rispetto a T ( n ) , quindi ogni volta che recuperi qualcosa dalla memoria RAM, il Turing la macchina prenderebbe nel caso peggiore T ( n )T(n)T(n)2T(n)T(n)T(n)tempo di trovare in sequenza l'elemento desiderato dal nastro. Oltre all'accesso alla memoria, il resto delle operazioni dovrebbe richiedere circa lo stesso tempo. E così ottieni il limite.


2
Le RAM possono calcolare la lunghezza dell'input (e quindi anche la parte di quella lunghezza) in tempo logaritmico, ma le macchine di Turing di base hanno bisogno di tempo lineare per calcolare quella parità.

1

L'esempio seguente dimostra che un algoritmo che impiega O ( n log ( n ) ) per risolvere un problema su word-Ram potrebbe aver bisogno di O ( n 2 log ( n ) 3 ) su una Turing Machine (TM) a 1 nastro che esegue esattamente tutti i calcoli indicati da A . Comprendo che la domanda riguarda la TM a 1 nastro e la uso solo nella mia risposta. Questa è una modifica per rispondere alle osservazioni di Emil Jeřábek.AO(nlog(n))O(n2log(n)3)A

Troveremo la seguente conclusione più generale . Per dimostrare che il TM può risolvere in un problema risolto in O ( T ( n ) ) da un algoritmo A RAM, è non sufficiente corsa A sul TM. Potrebbe essere necessario un algoritmo intelligente . Lo stesso vale se si vuole dimostrare una O ( n log ( n ) )O(T(n)2)O(T(n))AAO(nlog(n))spese generali. Dimostrare l'esistenza di un algoritmo intelligente quando necessario sembra tutt'altro che immediato, per non dire altro. Ciò non è in linea con altre risposte che fondamentalmente propongono di simulare / eseguire sul TM tutti i calcoli della RAM (dell'algoritmo ) per annunciare una complessità TM come O ( T ( n ) 2 ) o O ( T ( n ) n log ( n ) ) .AO(T(n)2)O(T(n)nlog(n))

Problema: ci viene fornita una array / tabella con n = 2 k numeri interi ciascuno memorizzato su bit di registro ( n ) . Ci viene dato un secondo array d con posizioni log ( n ) , ciascuna delle quali registra un numero di bit log ( n ) . Per ogni t [ 0 .. log ( n ) - 1 ] , definiamo X t = 1 se tab [ i ]tabn=2klog(n)dlog(n)log(n)t[0..log(n)1]Xt=1tab[i]MOD MOD d [ t ] i [ 0 .. n / 2 - 1 ] . Altrimenti, X t = 0 . Uscita log ( n ) - 1 t = 0 X t . Ritengo che l'input sia dato come un nastro con n log ( n ) +d[t]=tab[n/2+i]d[t] io[0 ..n/2-1]Xt=0Σt=0log(n)-1Xt cifre binarie, per rispondere ai commenti di Emil Jeřábek.nlog(n)+log(n)log(n)

Algoritmo su RAMUN Una RAM con dimensioni di parole richiede O ( n log ( n ) + log ( n ) 2 ) = O ( n log ( n ) ) per leggere i dati di input della stringa binaria. Ma dopo aver letto i dati, può funzionare solo con parole di dimensioni log ( n ) . L'algoritmo A calcola qualsiasi X t in O ( nw=log(n)O(nlog(n)+log(n)2)O(nlog(n))log(n)UNXt esaminandotutto i [ 0 .. n / 2 - 1 ] e verificando la condizione. Il ciclo principale di A èFOR t = 0 , 1 , 2 , log ( n ) - 1 : calcola X t . La complessità totale è O ( n log ( n ) ) (lettura dati) + O ( n log ( n ) )O(n)io[0 ..n/2-1]UNt=0,1,2,...log(n)-1XtO(nlog(n))O(nlog(n))(facendo i calcoli), quindi può fare tutto in O ( n log ( n ) ) su RAM.UNO(nlog(n))

Algoritmo sulla TM a 1 nastro:UN sostengo che la TM a nastro singolo abbia bisogno del tempo per una t fissa . Dal punto di vista della TM, determinare A t equivale a verificare l'uguaglianza di due stringhe binarie di lunghezza O ( n log ( n ) ) . Ad esempio, la scheda operativa MOD [ i ] MOD d [ t ] potrebbe essere equivalente alla rimozione del bit 0 della schedaO(n2log(n)2)tUNtO(nlog(n))linguetta[io]d[t]0 . In tali casi, determinare A t equivale al test di uguaglianza su stringhe di bit con lunghezza n ( log ( n ) - 1 ) / 2 . È noto che testare l'uguaglianza di due stringhe di lunghezza m richiede O ( m 2 ) sul TM a 1 nastro, ma non riesco proprio a trovare un riferimento in questo momento. Tuttavia, fornisco una prova in ps. Se la TM esegue ilciclo principaledi A , deve spendere almeno O ( ( n log nlinguetta[io]UNtn(log(n)-1)/2mO(m2)UN per ogni t = 0 , 1 , 2 , log ( n ) - 1 , che termina in O ( n 2 log ( n ) 3 ) .O((nlogn)2)t=0,1,2,...log(n)-1O(n2log(n)3)


ps. Mostro che il test di uguaglianza su stringhe di bit con bit non può essere più veloce del test di palinite su stringhe con bit m (è noto che la palindrome impiega almeno O ( m 2 ) tempo). Possiamo modificare qualsiasi algoritmo TM per test di uguaglianza per risolvere palindromo. Supponiamo che il test di uguaglianza TM inizi con due numeri interi: uno a sinistra della testa, uno a destra (questa è la forma di input più semplice per la TM). Ogni spostamento sulle posizioni di sinistra può essere speculare (riflesso) sulle posizioni di destra. Costruiamo una TM con mirroring: ogni volta che la TM iniziale si trova in una posizione - x < 0 (a sinistra), la TM con mirroring è nella posizione xmmO(m2)-X<0X(sulla destra). Se una TM risolse il test di uguaglianza in meno di , questa TM speculare modificata risolverebbe il palindromo in meno di O ( m 2 ) .O(m2)O(m2)

Inoltre, ci sono alcuni algoritmi TM per il test di uguaglianza e tutti richiedono tempo quadratico perché hanno bisogno di un po 'di zigzag, vedi per esempio l'esempio 2 di Turing Machine a corsi.cs.washington.edu/courses/cse431/14sp/scribes/ lec3.pdf


Il limite inferiore per i palindromi vale solo per il modello innaturale a nastro singolo. È semplice testare l'uguaglianza di due stringhe su una TM in tempo lineare. Lo stesso vale per l'uguaglianza di due sequenze di voci più lunghe. Inoltre, affinché la domanda abbia un senso, gli input per entrambi i modelli di macchine devono essere identici, cioè scritti come stringhe su un alfabeto finito. Pertanto, la tua RAM avrebbe bisogno del tempo O (log n) per leggere ogni voce e convertirla in una parola, rendendo inutile questa operazione.
Emil Jeřábek,

@Emil Jeřábek, modificherò la mia risposta per indicare che penso solo alla TM a 1 nastro. Quando dici che una TM può testare l'uguaglianza in tempo lineare, suppongo che tu pensi a una TM a 2 nastri. Tuttavia, ho capito che l'intera domanda riguarda le TM a 1 nastro. Per quanto riguarda il modulo di input, devo confessare che potresti avere ragione, almeno per alcune word-RAM. Ma per quanto ne so, un array int C ++ memorizza gli interi uno dopo l'altro senza separatore, come se memorizzassero insieme una sequenza di bit. 10 in 16 bit occupano esattamente 160 bit, no? Anche se non fosse così, si potrebbe costruire una macchina che funzioni in questo modo.
Daniel Porumbel,

3
Il modello standard di Turing in teoria della complessità è il multi-nastro. Non riesco a vedere come il C ++ abbia rilevanza qui, non stiamo discutendo del C ++, ma del modello RAM. In questo modello, le singole posizioni di memoria possono contenere numeri di lunghezza , ma possiamo ancora operare solo su una (o O ( 1 ) ) posizione di memoria alla volta. In particolare, possiamo accedere all'input solo una posizione alla volta: non vi è alcuna operazione che ti consenta di fare “leggere log n posizioni di input e collegarle insieme in una sola parola” in tempo costante. O(logn)O(1)logn
Emil Jeřábek,

Esistono due possibilità: (1) La posizione di input [0] contiene il primo bit del primo numero, la posizione [1] contiene il secondo bit del primo numero e così via. Quindi è necessario il tempo per leggere su RAM, proprio come per una macchina Turing. Pertanto, anche con TM a nastro singolo, si ottiene solo una velocità quadratica. (2) La posizione di input [0] contiene il primo numero, la posizione [1] il secondo numero e così via. Quindi il problema non ha senso su una TM, in quanto non è in grado di elaborare l'input di questo modulo. Pertanto, non si ottiene alcuna accelerazione, ma un problema che è espressibile solo in uno dei modelli di macchina. O(nlogn)
Emil Jeřábek,

@Emil Jeřábek, in seguito alle tue osservazioni, ho modificato la domanda per proporre un problema e un algoritmo RAM che impiega esplicitamente per leggere i dati (da un nastro). Ho rimosso alcune delle mie osservazioni che non sono più pertinenti. Spero che questo risolva il problema che hai sottolineato. O(nlog(n))
Daniel Porumbel,
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.