我对有关通用时空权衡的已发布结果的早期历史很感兴趣。特别是,我想知道谁首先描述了以下类型的算法,该算法使用与数据流图的深度(而非宽度)成正比的空间(加上大小)来评估具有任意度为O(1)的任意数据流图的计算通过对图形进行直接的深度优先评估来实现。更详细地:
令数据流图为G =(V,E),其中V是计算顶点的集合(O(1)大小的数据值),E是边的集合(v_p,v_s),使得后继值顶点v_s \ in V立即取决于先前顶点v_p \ in V的值。令v_f为顶点,没有后继代表计算的最终结果。令我成为输入顶点的规范排序集合(无前任),因为i \ in I给出了x(i)的值。对于其他顶点v \ in S,其值由x(v)= F_v(x(P(v)))定义,其中P(v)是v的前任的规范排序列表,x(P(v))为它们的值的对应列表,F_v是顶点函数,该函数根据其前任值列表确定其值。
有了这种设置,所讨论的算法就非常明显且微不足道:
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)
这需要递归的O(d)级别,其中d是数据流图的深度,并且由于假设数据流图的入度是恒定的,并且d的大小,每个级别的堆栈空间是恒定的数据值是恒定的。(为简单起见,即使顶点引用的大小实际上是| V |的对数,我也将顶点引用的大小也视为常量。)因此,总空间使用量为O(d + | I |)。数据流图的最大宽度可以成倍地大于此宽度,因此,在最好的情况下,与贪婪地对图进行评估相比(与每个图的贪婪评估相比),该技术可以节省大量空间。步骤,评估所有直接依赖于其值已知的顶点的所有顶点,
无论如何,至少在回想起来,这是一项相当明显的技术,并且它早已为人所知,但是我想知道有关它的文献的发展趋势。任何人都知道这种结果的早期历史(无论是用这些术语描述的,还是其他类似的描述),那么深入研究该主题的最佳参考是什么?
非常感谢-Mike Frank