Penso di poter ora dimostrare un limite inferiore non banale. L'idea è quella di implementare tali programmi con una famiglia di programmi di ramificazione comparativa. Il presupposto di "sola lettura" significa che la nostra famiglia di programmi di ramificazione utilizza poco, ovvero spazio ) . Quindi applichiamo il limite inferiore S T = Ω ( n 2 ) dimostrato da Borodin et al. in "Un compromesso spazio-tempo per l'ordinamento su macchine non ignare". Questo ci dà un n 2 / log n limite inferiore per il tempo.O ( logn )ST= Ω ( n2)n2/ logn
Più in dettaglio: possiamo rinunciare all'operazione 5 sopra. In parole povere, se possiamo già confrontare le intestazioni di due liste e stampare la testa di una lista, non è necessario isolare la testa di una lista su un particolare registro. Supponendo ciò, vediamo che ogni registro nella macchina memorizza solo una sottostringa finale dell'input.
Supponiamo che il nostro programma di registro abbia righe di codice e registri k , X 1 , ... , X k .ℓKX1, ... , XK
Fix . Costruiamo il programma di ramificazione comparativa per stringhe di lunghezza n come segue. Crea un nodo per ogni tupla ( i , d 1 , … , d k ) dove 1 ≤ i ≤ ℓ e 0 ≤ d 1 , … , d k ≤ n . L'idea è che i calcoli nella macchina del registro corrispondono ai percorsi nel programma di diramazione e siamo al nodo ( i , d 1 , ... , dnn( io , d1, ... , dK)1≤i≤ℓ0≤d1,…,dk≤n se siamo alla riga i nella macchina del registro e la lunghezza della stringa memorizzata in X i è d i . Ora, dobbiamo definire i bordi diretti del programma di ramificazione(i,d1,…,dk)iXidi
Se la riga è del moduloi
se poi goto i 1 altro goto i 2Xu<Xvi1i2
quindi per tutto , il nodo ( i , d 1 , ... , d k ) viene etichettato confrontando l' elemento d u -th e d v -th dell'input e facendo in modo che il bordo "vero" vada a ( i 1 , d 1 , ...d1,…,dk(i,d1,…,dk)dudv e il bordo "falso" su ( i 2 , d 1 , ... , d k(i1,d1,…,dk) .(i2,d1,…,dk)
Se la riga è del moduloi
, vai alla linea i ′X1←tail(X2)i′
poi c'è una freccia da qualsiasi nodo a ( i ′ , d 2 - 1 , ... , d k ) .(i,d1,…,dk)(i′,d2−1,…,dk)
Se la riga è del moduloi
, vai alla riga i ′print(head(Xu))i′
poi c'è una freccia da qualsiasi nodo a ( i ′ , d 1 , ... , d k ) che è etichettata dal nodo d u dell'ingresso.(i,d1,…,dk)(i′,d1,…,dk)du
Spero che questi esempi chiariscano come intendo costruire il mio programma di diramazione. Quando tutto è detto e fatto, questo programma di ramificazione ha al massimo nodi, quindi, dispone di spazi O ( log n )ℓ⋅nkO(logn)