Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 简单依赖算法的问题_Algorithm_Sorting_Tree_Dependencies_Directed Acyclic Graphs - Fatal编程技术网

Algorithm 简单依赖算法的问题

Algorithm 简单依赖算法的问题,algorithm,sorting,tree,dependencies,directed-acyclic-graphs,Algorithm,Sorting,Tree,Dependencies,Directed Acyclic Graphs,在我的webapp中,我们有许多字段,这些字段汇总了其他字段,而这些字段汇总了更多字段。我知道这是一个有向无环图 当页面加载时,我计算所有字段的值。我真正想做的是将我的DAG转换成一个一维列表,其中包含一个有效的顺序来计算其中的字段 例如: A=B+D,D=B+C,B=C+E 有效计算顺序:E->C->B->D->A 现在,我的算法只是迭代地将简单的插入到列表中,但我遇到了一些情况,在这些情况下,插入开始中断。我在想,需要做的是将所有依赖项计算成一个树形结构,然后将其转换成一维形式?有没有一个简

在我的webapp中,我们有许多字段,这些字段汇总了其他字段,而这些字段汇总了更多字段。我知道这是一个有向无环图

当页面加载时,我计算所有字段的值。我真正想做的是将我的DAG转换成一个一维列表,其中包含一个有效的顺序来计算其中的字段

例如: A=B+D,D=B+C,B=C+E 有效计算顺序:E->C->B->D->A


现在,我的算法只是迭代地将简单的插入到列表中,但我遇到了一些情况,在这些情况下,插入开始中断。我在想,需要做的是将所有依赖项计算成一个树形结构,然后将其转换成一维形式?有没有一个简单的算法可以将这样一棵树转换成一个有效的排序方式?

您在寻找什么?这会对DAG施加排序(序列或列表)。例如,电子表格使用它来计算单元格之间的依赖关系。

您需要的是深度优先搜索

function ExamineField(Field F)
{
    if (F.already_in_list)
        return

    foreach C child of F
    {
        call ExamineField(C)
    }

    AddToList(F)
}
然后依次对每个字段调用ExamineField(),列表将按照您的规范以最佳顺序填充

请注意,如果字段是循环的(也就是说,您有类似于A=B+C,B=A+D的内容),则必须修改算法,以使其不会进入无休止的循环

以您的示例为例,这些呼叫将转到:

ExamineField(A)
  ExamineField(B)
    ExamineField(C)
      AddToList(C)
    ExamineField(E)
      AddToList(E)
    AddToList(B)
  ExamineField(D)
    ExamineField(B)
      (already in list, nothing happens)
    ExamineField(C)
      (already in list, nothing happens)
    AddToList(D)
  AddToList(A)
ExamineField(B)
  (already in list, nothing happens)
ExamineField(C)
  (already in list, nothing happens)
ExamineField(D)
  (already in list, nothing happens)
ExamineField(E)
  (already in list, nothing happens)

列表将以C、E、B、D、A结尾。

非常感谢,这正是我想要的术语。非常感谢您的示例!这正是我想要做的,尽管我最终选择了迭代算法。