javascript - 矩阵的所有变体

标签 javascript algorithm matrix

我正在尝试编写一个算法来获取 JavaScript 中矩阵的所有可能变化。 这是我想要实现的目标:

blue,red
male,female,other
small,medium,large

-----------------

blue,male,small
blue,male,medium
blue,male,large

blue,female,small,
blue,female,medium,
blue,female,large

blue,other,small,
blue,other,medium,
blue,other,large

red,male,small
red,male,medium
red,male,large

red,female,small,
red,female,medium,
red,female,large

red,other,small,
red,other,medium,
red,other,large

知道如何做到这一点吗?

最佳答案

你想要的是几个列表的笛卡尔积。如果您有一组固定的列表,则嵌套循环是生成笛卡尔积的简单方法。

您可以通过以里程计样式迭代列表来将其推广到任意列表。 (不过,里程表的每个数字可能有不同的范围。)

方法如下:

function cartesian(m) {
    const res = [];
    const index = [];    // current index
    const max = [];      // length of sublists

    for (let i = 0; i < m.length; i++) {
        index.push(0);
        max.push(m[i].length);
    }

    for (;;) {
        res.push(index.map((i, j) => m[j][i]));

        let i = 0;
        index[i]++;

        while (index[i] == max[i]) {
            index[i] = 0;
            i++;

            if (i == m.length) return res;
            index[i]++;
        }
    }
}

这样调用它:

const m = [
    ["blue", "red"],
    ["male", "female", "other"],
    ["small", "medium", "large"],
];

const p = cartesian(m);

这会创建一个包含所有可能性的巨大列表,这可能并不理想。您可以通过对每种可能性执行任何您想要执行的操作来更改函数,其中上面的代码将当前列表推送到结果数组。上面的代码更改了每次迭代中的第一项,这与您在帖子中显示的内容相反。

关于javascript - 矩阵的所有变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60954678/

相关文章:

c++ - 初始化矩阵

python - numpy einsum 的替代品

arrays - 从一组属性重建位序列

javascript - Angular 将相同的成功和错误函数体应用于不同的 $http 请求

javascript - 如何在页面中应用JavaScript的replace()方法2次

javascript - 如何在 React 中使用数据添加动态字段(Hooks)

c# - 递归回溯迷宫有时会留下瓷砖

c++ - 矩阵实现类 C++ 中的内存管理

javascript - 在 iPhone Safari 虚拟键盘上打字时滚动到所选元素

javascript - 单击它时如何删除图表的边框?