¿Historia temprana de ciertos resultados en compensaciones espacio-temporales?


14

Estoy interesado en la historia temprana de los resultados publicados sobre compensaciones de espacio-tiempo de propósito general. En particular, quiero saber quién describió por primera vez el siguiente tipo de algoritmo para evaluar un cálculo que tiene un gráfico de flujo de datos arbitrario con O en grado (1) usando un espacio proporcional a la profundidad (no ancho) del gráfico de flujo de datos (más el tamaño de la entrada) haciendo una evaluación directa de profundidad del gráfico. Con más detalle:

Deje que el gráfico de flujo de datos sea G = (V, E) donde V es el conjunto de vértices computacionales (valores de datos de tamaño O (1)) y E es el conjunto de aristas (v_p, v_s), de modo que el valor del sucesor vértice v_s \ en V depende inmediatamente del valor del vértice predecesor v_p \ en V. Sea v_f el vértice sin sucesores que represente el resultado final del cálculo. Deje que sea un conjunto de vértices de entrada ordenado canónicamente (sin predecesores), para i \ in I se da su valor x (i). Para otros vértices v \ en S, sus valores están definidos por x (v) = F_v (x (P (v))) donde P (v) es una lista ordenada canónicamente de los predecesores de v, x (P (v)) es la lista correspondiente de sus valores, y F_v es la función del vértice que determina su valor en función de la lista de valores de sus predecesores.

Dada esta configuración, el algoritmo en cuestión es bastante obvio y trivial:

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)

Esto toma O (d) niveles de recursividad, donde d es la profundidad del gráfico de flujo de datos, y el espacio de la pila en cada nivel es constante debido a los supuestos de que el grado en grados del gráfico de flujo de datos es constante y que el tamaño de Los valores de los datos son constantes. (Para simplificar aquí, también estoy tratando el tamaño de las referencias de vértice como constantes, aunque en realidad son logarítmicas en | V |.) Por lo tanto, el uso del espacio total es O (d + | I |). El ancho máximo del gráfico de flujo de datos puede ser exponencialmente mayor que esto, por lo que, en el mejor de los casos, esta técnica puede proporcionar un ahorro de espacio bastante extremo, en comparación con, por ejemplo, una evaluación ambiciosa del gráfico (que podría ser, en cada paso, evalúe todos los vértices que dependen directamente solo de vértices cuyos valores ya se conocen,

De todos modos, es una técnica bastante obvia, al menos en retrospectiva, y sin duda es conocida desde hace mucho tiempo, pero me preguntaba cómo va la literatura al respecto. Alguien conoce la historia temprana de resultados de este tipo (ya sea que se describan en estos términos u otros análogos), y ¿cuál sería una buena referencia para profundizar en este tema?

Muchas gracias, Mike Frank

Respuestas:


10

No sé si es la primera vez que ocurre o no, pero la construcción aparece en la prueba del Lema 1 de Borodin [Bor77] sobre la complejidad espacial de evaluar un circuito booleano. (Contiene algo más que la idea de la evaluación recursiva para reducir la complejidad del espacio más allá de los bits O ( D log S ) a O ( D + log S ) bits, donde D es la profundidad del circuito y S es el tamaño de el circuito.)

[Bor77] Allan Borodin. Sobre relacionar el tiempo y el espacio con el tamaño y la profundidad. SIAM Journal on Computing , 6 (4): 733–744, diciembre de 1977. DOI: 10.1137 / 0206054 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.