笛卡爾乘積的javascript版實現和應用

徐小夕發表於2019-08-30

笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積,又稱直積,表示為X × Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對的其中一個成員 。

例子

假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

笛卡爾乘積的javascript版實現和應用

一般的實現中,c語言,python,java實現的方式比較多,但是對於前端而言,也是有其實現意義的,

  • 比如淘寶的sku商品訂單組合的實現就需要笛卡爾乘積,根據商品的子型別和不同尺寸生成n種可能的組合
  • 某些情況下用於尋找連續日期中殘缺的資料,可以先笛卡爾積做一個排列組合,然後和目標表進行關聯,查詢哪些資料缺少了
  • MySQL的多表查詢
  • 生成棋牌座標

等等,只有你想不到的,沒有它實現不了的。接下來就來看看他的具體實現吧!

笛卡爾積的javascript實現

/*
 * @Author: Mr Jiang.Xu 
 * @Date: 2019-08-31 00:05:33 
 * @Last Modified by:   Mr Jiang.Xu 
 * @Last Modified time: 2019-08-31 00:05:33 
 */
function cartesian(arr) {
    if (arr.length < 2) return arr[0] || [];
    return [].reduce.call(arr, function (col, set) {
        let res = [];
        col.forEach(c => {
            set.forEach(s => {
                let t = [].concat(Array.isArray(c) ? c : [c]);
                t.push(s);
                res.push(t);
            })
        });
        return res;
    });
}
複製程式碼

由於實現方法很多,這裡就不一一舉例了,上述實現方式的時間複雜度為O(n^3),還不是最優,所以有更好的實現方法歡迎留言實現哦~

如果想學習更多js演算法和資料結構,可以長按關注哦~ 由於最近工作變動,並且準備自研一套CMS開源系統,所以可能文章儘量每週更新一次,歡迎大家共同學習進步。

笛卡爾乘積的javascript版實現和應用

更多推薦

相關文章