【问题标题】:How to find all combination of an array in javascript如何在javascript中找到数组的所有组合
【发布时间】:2018-07-31 00:12:21
【问题描述】:

我目前正在使用 node.js,我想查找/尝试由存储在数组中的数据组合产生的所有独特可能性。

例子:

// source array
var array = [0,1,2];

// what i need :
0
1
2
00
01
02
10
11
12
20
21
22
000
001
002
etc, up to a configurable length.

我浏览了论坛,并没有找到类似的东西。

我在 npm 上进行了搜索,发现一些库正在做类似的事情,但从来没有我需要的所有可能性。我觉得我的需求与冒泡排序算法非常相似,但我不知道该怎么做。

另外,最好不要同时将整个输出存储在一个变量中,因为我的代码需要处理更大的数组。

此时我错过的任何想法或解决方案都会有所帮助!

编辑:另外,我想不断尝试组合,直到我认为它足够了,例如 500 次尝试或者最后的组合长度为 5。

【问题讨论】:

  • 到目前为止你有什么?我们如何提供帮助?
  • 对不起,我发的太快了,试图放标签,不小心放了回车...我用foreach循环尝试了几次,最后得到了一个非常类似于气泡的代码排序。但这还不够,因为我需要在某种限制下检查数组的所有可能性(假设在 X 组合之后我们停止,或者组合长度大于 Y)。
  • 根据您想要对结果执行的操作,您可能会发现 yield 很有帮助。
  • @mbrandau 是的,这似乎非常相似,除了我也会使用字符。我会调查这个帖子,我看的时候没看到。感谢您的帮助!

标签: javascript arrays node.js powerset


【解决方案1】:

另一种方法,具有几个可重用的功能:

const flatten = arrays => [].concat.apply([], arrays);
const range = (lo, hi) => [...new Array(hi - lo + 1)].map((_, i) => i + lo)
const join = joiner => list => list.join(joiner)

const charSeqs = (n, chars) => (n < 1) 
    ? [[]]
    : flatten(chars.map(char => charSeqs(n - 1, chars).map(
        seq => flatten([char].concat(seq))
      )))

const allCharSeqs = (n, chars) => flatten(range(1, n).map(i => charSeqs(i, chars)))

console.log(allCharSeqs(3, [0, 1, 2]).map(join('')))

【讨论】:

    【解决方案2】:
    function variations(arr, length) {
        if (length == 0)
            return [];
        else if (length == 1)
            return arr.map(e => e.toString());
    
        let result = [];
        for (let i = 0; i < arr.length; i++) {
            for (let tail of variations(arr, length - 1))
                result.push(arr[i].toString() + tail);
        }
        return result;
    }
    
    function variations2(arr, maxLength) {
        let result = [];
        for (let i = 0; i <= maxLength; i++)
            result = result.concat(variations(arr, i));
        return result;
    }
    

    例子:

    var array = [0,1,2];
    console.log(variations2(array, 2));
    

    输出:

    ["0", "1", "2", "00", "01", "02", "10", "11", "12", "20", "21", "22"]
    

    【讨论】:

    • 请注意,permute 可能不是一个好名字,因为这意味着有 n!结果,并且每个值每个输出只使用一次。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2012-04-09
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多