js 排列 组合 的一个简单例子

Posted dz45693

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 排列 组合 的一个简单例子相关的知识,希望对你有一定的参考价值。

最近工作项目需要用到js排列组合,于是就写了一个简单的demo。 前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了,

排列的实现方式: 全排列主要用到的是递归和数组的插入 比如12的全排列,首先把1拿出来放到elementCur,再获取由1组成的数组[2],然后在循环把1插入到0,1的位置后再返回1,2][2,1] 如果是123那么首先获取23的全排列[2,3][3,2],然后在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1] 

  /*
        全排列主要用到的是递归和数组的插入
        比如12的全排列,首先把1拿出来放到elementCur,再获取由1组成的数组[2],然后在循环把1插入到0,1的位置后再返回1,2][2,1]
        如果是123那么首先获取23的全排列[2,3][3,2],然后在插入1,[1,2,3][2,1,3][2,3,1][1,3,2][3,1,2][3,2,1]
        */
        function permutate(array/*需要进行全排列的一维数组*/, permutatedArray/*存放返回结果*/) {
            if (!permutatedArray) {
                permutatedArray = [];
            }
            if (array.length > 1) {
                //弹出第一个数
                var elementCur = array.shift();
                //排列剩余的数组
                permutate(array, permutatedArray);
                //返回剩余的数组的排列长度
                var permutatedArrayLen = permutatedArray.length;
                //第一个数与其他剩余数组所有数组组合
                for (var j = 0; j < permutatedArrayLen; j++) {
                    //弹出不齐的组
                    var p = permutatedArray.shift();
                    //把当前元素放到排列好的数组的所有位置
                    for (var i = 0; i <= p.length; i++) {
                        //复制排列好的数组
                        var r = p.slice(0);
                        //插入数据到数组的位置
                        r.splice(i, 0, elementCur);
                        //保存
                        permutatedArray.push(r)
                    }
                }
                //退出条件
            } else {
                permutatedArray.push([array[0]]);
            }
            return permutatedArray;
        }

那么我们需要一个组合C(m,n)的API,code如下,组合实现的原理非常简单,就是依次循环数组的元素,循环的嵌套层数是有m来决定的,内部的循环下标在外部的下标加1。所以用function来组装

  /*
        组合实现的原理非常简单,就是依次循环数组的元素,循环的嵌套层数是有m来决定的,内部的循环下标在外部的下标加1。所以用function来组装
        */
        function combination(arr/*n需要组合的一维数组*/, num/*m需要取几个元素来组合*/, fun/*对组合后的元素的处理函数,如全排列permutate*/) {
            /*这里假设num最大值为10 一般A(n,m)中的m应该不会太大 */
            if (arr.length < num || num > 10)
            {
                return [];
            }
            var variable = ["a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"];
            var replaceStr = "#$#";
            var str = " var arr=arguments[0]; var fun=arguments[1];  var ret=[]; for (var a = 0; a < arr.length; a++) { "+replaceStr+" } return ret;"
            for (var i = 1; i < num; i++) {
                str = str.replace(replaceStr, " for (var " + variable[i] + " =" + variable[i - 1] + "+ 1; " + variable[i] + " < arr.length; " + variable[i] + "++) { " + replaceStr + "  }")
            }
            var temp = " var temp= []; ";
            for (var i = 0; i < num; i++) {
                temp += "temp.push(arr[" + variable[i] + "]); ";
            }
            if (fun) {
                temp += " ret.push(fun(temp)); ";
            }
            else {
                temp += " ret.push(temp); ";
            }
            str = str.replace(replaceStr, temp);
            //console.log(str);
            return (new Function(str)).apply(null, [arr, fun]);
        }

那么我们一个普通的排列A(n,m)就很简单了。调用方式如下:

 var a = combination([1, 2, 3, 4, 5, 6], 3, permutate);
        for (var i = 0; i < a.length; i++) {
            for (var j = 0; j < a[i].length; j++) {
                console.log(a[i][j].join(‘‘));
            }
        }

 有不当的地方还请大家指正!

以上是关于js 排列 组合 的一个简单例子的主要内容,如果未能解决你的问题,请参考以下文章

一道排列组合数学问题

Relay.js 没有正确解析组合片段

字符串数组全排列——逐个追加组合算法

总结:组合与排列

js两个数组排列组合

js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合