数据结构存储分步指南

时间:2016-09-26 05:48:01

标签: javascript optimization data-structures graph

我正在尝试在Javascript中逐步建模(想想任何宜家指南)在哪里 1.每个步骤可以链接到一个或多个后续步骤, 2.一个步骤可以对前面的步骤有0或n个依赖关系 3.总有最后一步。像这样:

       o
      / \
o -> o   o -> o
      \ /
  o -> o

首先想到的是有向图结构,但由于该图具有使所有节点指向"前进"的唯一性。我想知道是否有更好的方法。感觉它应该是某种树和图形的混合。

最终,我想使用此结构来优化建议的执行计划。我不会过于担心插入,删除,更新或查询的优化,因为这些指南总是少于100步。我只是在寻找一种能够使编码变得更容易的数据结构。

我将在此结构中查询的内容:

  • 关键路径是什么?
  • 步骤X的依赖关系/后续步骤是什么?
  • 并行化/序列化执行这些步骤的最有效方法是什么?

1 个答案:

答案 0 :(得分:1)

有向图应该是最简单的方法。在阅读本文的其余部分之前,请记住我没有谈论对数据结构进行并列化,因为我不知道如何去做。无论如何,您不会处理大量数据,因此您不会遇到任何效率问题。

我们将为每个步骤存储两个数组:一个用于后续步骤,另一个用于依赖项。将支持以下操作:

  1. 在O(1)中插入步骤:只为它创建两个空数组
  2. O(1)中的依赖项插入:只需在相关步骤的依赖项/下一步数组的末尾添加一个条目
  3. O(N)中的步骤删除:让S成为要删除的步骤。迭代S的依赖数组,对于数组中的每个元素,转到该元素的下一步数组并删除包含S的条目。然后迭代S的下一步数组,并对于数组中的每个元素,转到此元素的依赖项数组并删除包含S的条目。然后删除与S
  4. 相关的两个数组
  5. O(N)中的依赖项删除:只需在依赖项/下一步数组中查找与要删除的依赖项相关的条目并将其删除
  6. 检查O(N)中步骤S的所有依赖关系和后续步骤:只迭代与步骤S相关的两个数组
  7. 在O(N + M)中找到关键路径,其中M是依赖关系的总数:我们将运行动态编程算法:让f(v)成为从顶点v开始的最长路径。我们可以计算如果v没有后续步骤,则f(v)= 1,否则对于每个下一步骤,f(v)= max(f(u)+1)。为每个步骤运行动态编程算法,关键路径是所有最长路径中的最大路径。
  8. 请注意,某些操作可以使用BST或哈希表加速,但由于您要处理小数据,我试图尽可能简单。