Storia iniziale di alcuni risultati sui compromessi spazio-temporali?


14

Sono interessato alla prima storia dei risultati pubblicati sui compromessi spazio-tempo generici. In particolare, voglio sapere chi ha descritto per primo il seguente tipo di algoritmo per valutare un calcolo avente un grafico di flusso di dati arbitrario con in gradi O (1) usando lo spazio proporzionale alla profondità (non larghezza) del grafico del flusso di dati (più la dimensione dell'input) eseguendo una prima valutazione approfondita del grafico. Più in dettaglio:

Lascia che il grafico del flusso di dati sia G = (V, E) dove V è l'insieme dei vertici computazionali (O (1) -size data data) ed E è l'insieme dei bordi (v_p, v_s), in modo tale che il valore del successore vertice v_s \ in V dipende immediatamente dal valore del predecessore vertice v_p \ in V. Sia v_f il vertice senza successori che rappresentano il risultato finale del calcolo. Consentitemi di essere un insieme ordinato di vertici di input (senza predecessori), poiché i \ in I viene dato il suo valore x (i). Per altri vertici v \ in S, i loro valori sono definiti da x (v) = F_v (x (P (v))) dove P (v) è un elenco canonico dei predecessori di v, x (P (v)) è l'elenco corrispondente dei loro valori e F_v è la funzione del vertice che determina il suo valore in funzione dell'elenco dei valori dei suoi predecessori.

Data questa configurazione, l'algoritmo in questione è abbastanza ovvio e banale:

def eval(v):     (v can be any vertex in the graph)
   let P := P(v), the list of v's predecessors  (has O(1) elements by assumption)
   let val[] := uninitialized array of |P| data values
   for each predecessor p[i] in P (i.e. for i from 1 to |P|):
      if p[i] is in I then
         val[i] = x(p)      (look up a given input)
      else
         val[i] = eval(p[i])   (recursive call)
   return F_v(val[])        (apply vertex's function to list of predecessor values)

Questo richiede O (d) livelli di ricorsione, dove d è la profondità del grafico del flusso di dati e lo spazio di stack a ciascun livello è costante a causa delle ipotesi che il grado di in-gra del grafico del flusso di dati è costante e che la dimensione di i valori dei dati sono costanti. (Per semplicità qui, sto trattando la dimensione dei riferimenti ai vertici anche come costante, anche se sono davvero logaritmici in | V |.) Pertanto, l'utilizzo dello spazio totale è O (d + | I |). La larghezza massima del grafico del flusso di dati può essere esponenzialmente più grande di questa, quindi nel migliore dei casi questa tecnica può fornire un risparmio di spazio piuttosto estremo, rispetto, per esempio, ad una avida valutazione in avanti del grafico (che potrebbe essere, per ogni passo, valuta tutti i vertici che dipendono direttamente solo dai vertici i cui valori sono già noti,

Ad ogni modo, è una tecnica abbastanza ovvia, almeno a posteriori, ed è sicuramente nota da molto tempo, ma mi chiedevo quanto risalisse la letteratura. Qualcuno conosce la prima storia dei risultati di questo tipo (se descritti in questi termini, o altri analoghi), e quale sarebbe un buon riferimento per approfondire questo argomento?

Grazie mille, Mike Frank

Risposte:


10

Non so se è la prima occorrenza o meno, ma la costruzione appare nella dimostrazione di Lemma 1 di Borodin [Bor77] sulla complessità spaziale della valutazione di un circuito booleano. (Contiene leggermente più della semplice idea di una valutazione ricorsiva per ridurre ulteriormente la complessità dello spazio dai bit O ( D log S ) ai bit O ( D + log S ), dove D è la profondità del circuito e S è la dimensione di il circuito.)

[Bor77] Allan Borodin. Relazionare tempo e spazio con dimensioni e profondità. SIAM Journal on Computing , 6 (4): 733–744, dicembre 1977. DOI: 10.1137 / 0206054 .

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.