确定关系树的最优算法

时间:2021-02-23 17:33:21

标签: algorithm tree

假设您有一个如下所示的公式列表:

KPI1 = somevalue1 + somevalue2
KPI2 = somevalue1 + somevalue3
KPI3 = KPI1 + somevalue4
KPI4 = KPI2 + KPI3
etc.

对于公式中引用的每个元素,可以使用哪种最佳算法获得关系树?

即使用上面的示例:

+------------------------------------------------------------+
|    somevalue3    somevalue1    somevalue2    somevalue4    |
|        |             | |            |             |        |
|        --------------- --------------             |        |
|               |               |                   |        |
|              KPI2            KPI1                 |        |
|               |               |                   |        |
|               |               ---------------------        |
|               |                         |                  |
|               |                        KPI3                |
|               |                         |                  |
|               ---------------------------                  |
|                            |                               |
|                           KPI4                             |
+------------------------------------------------------------+

1 个答案:

答案 0 :(得分:1)

您可以使用哈希映射,其中键对应于定义的名称(例如“KPI3”),对应的值是该名称所依赖的名称/值列表(例如 ["KPI1", somevalue4])。

这是 JavaScript 中的一个实现,我们可以在其中使用原生的 Map 构造函数。一旦地图填充了所有依赖项,递归函数可以例如打印树:

function printTree(map, name, indent="") {
  console.log(indent + name);
  let children = map.get(name);
  if (children !== undefined) {
    for (let childName of children) {
      printTree(map, childName, indent+"  ");
    }
  }
}

let map = new Map();
map.set("KPI1", ["value1", "value2"]);
map.set("KPI2", ["value1", "value3"]);
map.set("KPI3", ["KPI1", "value4"]);
map.set("KPI4", ["KPI2", "KPI3"]);

printTree(map, "KPI4");

在 Python 中,您将使用字典:

def print_tree(d, name, indent=""):
  print(indent + name)
  children = d.get(name, None)
  if children is not None:
    for childName in children:
      print_tree(d, childName, indent+"  ")

d = dict()
d["KPI1"] = ["value1", "value2"]
d["KPI2"] = ["value1", "value3"]
d["KPI3"] = ["KPI1", "value4"]
d["KPI4"] = ["KPI2", "KPI3"]

print_tree(d, "KPI4")