【问题标题】:JavaScript algorithm to give every possible combination of items and store them in an array [duplicate]JavaScript算法给出每个可能的项目组合并将它们存储在数组中[重复]
【发布时间】:2013-12-16 11:45:56
【问题描述】:

我正在寻找一种为这个问题制作程序的好方法:

首先给出一个带有字符串值的数组:

    var array1 = ["a", "b", "c", "d"]

接下来我想将字符串值的所有可能组合(顺序)存储在新数组中

例如:

    combo1 = ["a", "b", "d", "c"]
    combo2 = ["a", "c", "b", "d"]
    combo3 = [...etc.]

程序还需要能够处理大数组。例如,第一个数组 (array1) 中最多有 20 个项目。所以它需要用一个函数自动完成创建“组合数组”的所有工作。

解决这个问题的好方法是什么?最好使用 JavaScript,但我愿意用其他语言了解它。

正如您可能已经猜到的那样,在编程方面,我是一个相当初学者。我已经掌握了基础知识,现在正在尝试为一个项目编写一个程序。请帮助并提前感谢您!

【问题讨论】:

  • 你有没有为此想出任何算法?
  • 这些被称为排列。如果您尝试计算大型列表(例如 20 个项目)的排列,您可能会耗尽内存。 20 个项目的列表有 20 个阶乘排列......这是 2.432902 x 10^18 或超过 200 万个不同的组合。
  • 存储结果的另一种方法是在每次生成新结果时都有一个回调,您将一个排列传递给它。这样您就可以避免存储所有结果的内存需求。但是,您只是将问题从内存限制之一转移到执行时间之一。
  • @SpoonMeiser 我前段时间就这个想法写了一个答案:stackoverflow.com/a/18874247/1669279 你说得对,问题固有的指数复杂性意味着执行时间对于许多项目来说太长了。 20 可能太多了。
  • 我忽略了内存问题。所以现在我将它保留在 5 个项目上,如果我是正确的,应该返回 120 个结果。我还没有想出一个可行的算法,但我的第一直觉是使用 for 循环。

标签: javascript arrays combinations


【解决方案1】:

在haskell中你可以使用permutations

 permutations "abc" == ["abc","bac","cba","bca","cab","acb"]

在 JavaScript 中你需要自己编写排列函数:

function permutations(list) {
    if (list.length <= 1)
        return list.slice();

    var result = []
      , i = 0
      , resultRest
      , current
      , rest
      , j;
    for(; i<list.length; i++) {
        rest = list.slice(); // make a copy of list
        current = rest.splice(i, 1);
        permutationsRest = permutations(rest);
        for(j=0; j<permutationsRest.length; j++) {
            result.push(current.concat(permutationsRest[j]));
        }
   }
   return result;
}
permutations(['a', 'b', 'c'])
> [ [ 'a', 'b', 'c' ],
    [ 'a', 'c', 'b' ],
    [ 'b', 'a', 'c' ],
    [ 'b', 'c', 'a' ],
    [ 'c', 'a', 'b' ],
    [ 'c', 'b', 'a' ] ]

但是,如果您的输入很大,这将需要一段时间。也许您应该考虑另一种方法。

【讨论】:

  • 非常感谢您的帮助!
  • 代码当然可以,但是我怎样才能在它自己的数组中获得每个排列呢?例如: var Arr1 = [ 'a', 'b', 'c' ] , var Arr2 = [ 'a', 'c', 'b' ] ?你能帮我写一些额外的代码吗?
  • 您可以在浏览器环境中做一件事:for(var i=0; i&lt;permutaions.length; i++){ window['Arr'+i] = premutations[i];} 然后所有Arr1 变量都是全局可用的(window 是浏览器中的全局命名空间)。但是,我认为这是一种不好的做法。
  • 你是最棒的!百万谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2014-12-27
  • 2021-01-02
  • 2023-02-09
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多