【问题标题】:All combinations of properties in an array数组中的所有属性组合
【发布时间】:2014-09-26 19:26:27
【问题描述】:

好的,过去几天我一直在为此烦恼。生成所有可能组合的数组的最简洁(没有巨大开销的任何东西)方法是什么

var input = [
    {a: 1}, {a: 2, b: 3},
    {b: 4}, {b: 5}, {a: 6}
];

所以我希望生成以下内容:

var output = [
    {a: 1}, {b: 4}, {b: 5}, {a: 6},
    {a: 1, b: 4}, {a: 1, b: 5},
    {a: 6, b: 4}, {a: 6, b: 5},
    {a: 2, b: 3}
];

问题是,在我的具体情况下,我正在谈论 4 个属性(实际上我需要为每组不同的属性集生成一个单独的数组,但是这些都是我以后应该能够自己实现的东西) .然而,我正在寻找的只是一些关于如何解决这个问题的通用伪代码,而不是有人为我编写它或类似的东西。

我觉得这应该是我应该能够弄清楚的事情,但我只是没有到达那里。首先,我为所有属性组合(所有a、所有b、所有c、所有ab、所有bc等)生成单独的数组。然而问题是,已经有了 3 个属性,接下来您必须为每个 a 添加所有 b's、c's 和 bc's。现在,为单个属性写出来很简单,但是为 n 属性写一个通用的解决方案让我完全无法理解。

【问题讨论】:

  • @Teemu:虽然我们谈论的是 4 个属性,但生成的项目总数将“只是”在 3000 左右(这绝对不会使现代浏览器崩溃,即使生成的数量项目将是 10 倍)。此外,我不确定你从哪里得到你的想法,这将在浏览器中运行(事实并非如此,在 node.js 中的应用程序设置上运行它)。
  • 我想我没有关注您的输入与输出的关系或在您的情况下构成“组合”的内容。例如,为什么您的输出中没有{a:2, b:4}?具有单个键值的对象和具有多个键/值对的对象有什么区别?
  • @MikeBrant:关于您的第一个问题:因为输入中没有定义 {a:2}。多键/值对输入已经是两个项目的定义组合,如果它的长度等于属性的数量,则直接进入输出。但是,如果我们要讨论 3 个属性,它将与单个 c 的所有可能值相结合。

标签: javascript combinatorics


【解决方案1】:

我不确定我是否真的理解这些要求,但您可以尝试按照以下方式使用递归解决方案(使用伪代码而不是 javascript):

def generate(i,C):
    # C is a dictionary representing the currently defined properties
    # We are allowed to add to our set of properties from the choices input[i],input[i+1],...

    # First choose a non-conflicting set of additional properties to add
    while i<len(input):
        if all of properties in input[i] are not in C:
             Add properties in input[i] to C
             solutions.append(C)
             generate(i+1,C)
             Remove properties in input[i] from C
        i++

generate(0,{})

【讨论】:

  • 它似乎确实在工作,我的大脑仍然很难理解这个结构,但如果它仍然符合我明天早上的审查,那么你先生是一个天才写出来的你的头顶:D。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多