【问题标题】:How to determine all permuations &| combinations in a hiearchical structure如何确定所有排列 &|层次结构中的组合
【发布时间】:2018-10-18 05:26:16
【问题描述】:

我试图找出一种方法来确定虚构层次结构中父 子关系的每个可能组合。 (组合或排列 - 一旦你弄清楚了所有排列,你也得到了可能的组合。

约束

节点之间的关系可以是 1:1、1:many 或 many to 1 但绝不是 many:many。 当考虑到与任何其他给定祖先或父节点的关系时,层次结构中的每个节点都可以将 3 个属性中的 1 个附加到其关系。

例如

A -> B(A是B的祖先)

A(X) -> B(A 是 B 的祖先,具有属性 X)

A(Y) -> B(A 是 B 的祖先,具有属性 Y)

A(Z) -> B(A 是 B 的祖先,具有属性 Z)

以上 4 种关系均为有效结果。

同样的;

A & B -> C(A 和 B 都是 C 的祖先)

A (X) & B(X) -> C(A和B都是C的祖先,A有X,B有X)

A (X) & B(Y) -> C(同上,但现在 A & B 在此示例中具有 X & Y 属性)

以上3个也是完全有效的。

所以在伪代码中;

foreach(totalNodePopulation 中的节点 someNode)

{尝试每一个组合 SomeCombination 与每一个祖先 |孩子}

foreach(组合中的某种组合)

{ 确定所有 3 个变体}

下面的这段代码确定了简单的 Ints 列表的所有组合;

public Dictionary<int, List<int>> shouldReturnAllPossibleCombinations(List<int> number)
    {
        Dictionary<int, List<int>> combos = new Dictionary<int, List<int>>();

        double count = Math.Pow(2, number.Count);
        for (int i = 1; i <= count - 1; i++)
        {
            List<int> itemsInThisCombo = new List<int>();

            string str = Convert.ToString(i, 2).PadLeft(number.Count, '0');
            for (int j = 0; j < str.Length; j++)
            {
                if (str[j] == '1')
                {
                    System.Diagnostics.Debug.Write(number[j]);
                    itemsInThisCombo.Add(number[j]);
                }
            }
            combos.Add(i, itemsInThisCombo);
            System.Diagnostics.Debug.WriteLine(Environment.NewLine);
        }

        return combos;
    }

但是如何改进它以应对变体的“维度”?

非常感谢任何想法/指针,谢谢!

【问题讨论】:

  • “一个可以编辑回另一个” - 编辑(动词)“出于法律或安全目的审查或隐藏(文本的一部分)。”你的意思是什么?
  • 抱歉 - 英语不好。我的意思是,如果您设法编写了一种方法来找出所有可能的排列,那么您也可以通过推理确定所有组合。所以一个消灭另一个。
  • Ar X 和 Y 节点的属性?还是关系的属性?
  • @ZevSpitz 嗨 - 它们是节点的属性。或者另一种看待它的方式是,例如节点“A”(它本身只是一个节点)可以分别作为 Ax 和 Ay 和 Az 输入算法(即“假装”A 存在三次) .感谢您的评论 - 我将编辑我的原始问题以明确这一点,因为它有点模棱两可。

标签: c# math complexity-theory mathematical-optimization


【解决方案1】:

这是你的想法吗?

public class Node {
    public string Name { get; set; }
    public override string ToString() => Name;
}

public static List<(Node node1, Node node2, string relationship)> PossibleCombinations(List<Node> lst) {
    var ret = new List<(Node node1, Node node2, string relationship)>();
    var relationships = new string[] { null, "X", "Y", "Z" };
    foreach (var node1 in lst) {
        foreach (var node2 in lst) {
            if (node1==node2) { continue; }
            foreach (var relationship in relationships) {
                ret.Add((node1, node2, relationship));
            }
        }
    }
    return ret;
}

var lst = new List<Node>() {
    new Node() {Name="A"},
    new Node() {Name="B"},
    new Node() {Name="C"}
};
foreach (var node in lst) {
    foreach (var combination_variant in PossibleCombinations(lst)) {
        Console.WriteLine($"{node} - {combination_variant});
    }
}

AFAICT 这是您原始伪代码描述的反映:

foreach (node someNode in totalNodePopulation)
    {try every combination SomeCombination with every ancestor | child }
    foreach (somecombination in combinations)
       { determine all 3 variants}

【讨论】:

  • @zev-sptiz 嗨 - 谢谢,太好了,因为它重复了我给出的示例并争夺变体。然而,层次结构就是:例如 A-> B-> C。可以这么说,它可能是第 n 级“深”。我怀疑你的代码可以调整来处理这个问题?
  • @JonathanCobb 层次结构是否明确定义?或者只是集合中的每个节点都是它后面的一个的父节点,而它之前的一个节点的子节点?
  • 谢谢 - 层次结构明确开始,例如 A&B -> C 的祖先,它是 D&E&F 的祖先,E 有例如它自己的 4 个后代。然后.....可以从该层次结构中制作多少个节点组合?它可能是完全平坦的 ABCDE,它可能是 E > ABCD 或者它可能是 C>D&E>A &B 等等。这是真正的挑战 - 你当前的答案适用于一个“级别”。这种解释有帮助吗?
  • @JonathanCobb 我已经更新了我的答案;这更近了吗? Perhaos 如果您在问题中包含某种图表?
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2012-01-02
  • 2020-06-19
相关资源
最近更新 更多