JS算法與數據結構

行列互換

將一個數組中的行和列進行互換,應用場景:消消樂中找到橫豎排相連的3個相同的元素 (橫排好找,找到豎排中的相同元素就主要用到了行列互換)javascript

/**
 * 行列互換函數
 * @param  {array} arr       輸入的原始數組, 一維數組
 * @param  {Num}   rowSize   每行的列個數
 * @return {array} resultArr 新的數組
 */
function changeXY(arr, rowSize) {
    var resultArr = [],
        iNow      = 0;

    (function() {
        if (iNow == rowSize) return;
        for (var i = 0; i < arr.length; i++) {
            if (i % rowSize == iNow) {
                resultArr.push(arr[i]);
            }
        };
        iNow++;
        arguments.callee();
    })();

    return resultArr;
}

排列組合

排列的樹形表示法
![樹形表示法][1]
/**
 * 排列函數
 * @param  Array arr 輸入數組
 * @param  Num   num 取出的排列個數
 * @return Array     前幾位表示排列的可能性,最後一位表示排列的狀況數
 */
function arrange(arr, num) {
    var resultArr = [],
        resultNum = 0,
        iLayer    = 1;    //當前在第幾層
    if (num == 1) {
        resultArr = arr.concat();
        resultNum = arr.length;
    };

    function change(arr, iLayer, str) {
        for (var i = 0; i < arr.length; i++) {
            var arrClone  = arr.concat();
            var strClone = str + arrClone.splice(i, 1);

            if (num == iLayer) {
                for (var j = 0; j < arrClone.length; j++) {
                    resultArr.push(strClone + arrClone[j]);
                };
                resultNum += arrClone.length;
            } else {
                change(arrClone, iLayer+1, strClone);
            }
        };
    }

    //是從第二層開始執行,第一層經過for循環得出
    change(arr, iLayer+1, '');
    resultArr.push(resultNum);

    return resultArr;
}

排列的數學表示法

function A(m, n) {
    return f(m) / f(m-n);
}

function f(m) {
    if (m <= 1) return 1;
    return m * f(m-1);
}

console.log(A(3,1));

組合函數

組合的樹形表達法:先採用排列的方式獲取可能的值而後過濾掉其中重複的值java

/**
 * 組合函數
 * @param  Array arr 輸入數組
 * @param  Num   num 取出的組合個數
 * @return Array     前幾位表示組合的可能性,最後一位表示排列的狀況數
 */
function combination(arr, num) {
    var resultArr = [],
        resultNum = 0,
        iLayer    = 1;    //當前在第幾層
    if (num == 1) {
        resultArr = arr.concat();
        resultNum = arr.length;
    };

    function change(arr, iLayer, str) {
        for (var i = 0; i < arr.length; i++) {
            var arrClone  = arr.concat();
            var strClone = str + arrClone.splice(i, 1);

            if (num == iLayer) {
                for (var j = 0; j < arrClone.length; j++) {
                    resultArr.push(strClone + arrClone[j]);
                };
                resultNum += arrClone.length;
            } else {
                change(arrClone, iLayer+1, strClone);
            }
        };
    }

    //是從第二層開始執行,第一層經過for循環得出
    change(arr, iLayer+1, '');
    resultArr = unique(resultArr);
    resultArr.push(resultArr.length);

    return resultArr;
}

function unique(arr) {
    var validator = {};
    var resultArr = [];

    for (var i = 0; i < arr.length; i++) {
        var key = arr[i].split('').sort().join('');
        if (!validator[key]) {
            resultArr.push(arr[i]);
            validator[key] = 1;
        };
    };
    return resultArr;
}

console.log(combination(arr, 2));

組合的數學表達法

/**
 * 組合的數學表示法
 * C(m, n) = m! / ((m-n)! * n!)
 */
function C(m, n) {
    return f(m) / (f(m-n) * f(n));
}

function f(m) {
    if (m <= 1) return 1;
    return m * f(m-1);
}

console.log(C(3,2));

有課學是一站式程序員專屬課程返現平臺,支持極客時間,慕課網、網易雲課堂、知識星球、小專欄。
【有課學,學好課,有所獲】程序員

有課學

相關文章
相關標籤/搜索