-
1 # 邊緣人
-
2 # IT追夢—廈門站
笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X×Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對的其中一個成員[3] 。假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。A表示所有聲母的集合,B表示所有韻母的集合,那麼A和B的笛卡爾積就為所有可能的漢字全拼。設A,B為集合,用A中元素為第一元素,B中元素為第二元素構成有序對,所有這樣的有序對組成的集合叫做A與B的笛卡爾積,記作AxB.笛卡爾積的符號化為:A×B={(x,y)|x∈A∧y∈B}例如,A={a,b}, B={0,1,2},則A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
那如何用javascript實現笛卡爾乘積?
用javascript實現一個笛卡爾積的函式
-
3 # 鮑家大少
題目:JavaScript 實現笛卡爾乘積,一般用於商品 sku 屬性配置,例如輸入 ["1", "2"], ["a", "b"], ["+", "-", "x"] ,輸出 [ "1a+", "2a+", "1b+", "2b+", "1a-", "2a-", "1b-", "2b-", "1ax", "2ax", "1bx", "2bx" ]
解決方案:case1
case2若:考察的是dfs全排列,而不是複雜reduce/map
回覆列表
//笛卡兒積組合
function descartes(list) {
//parent上一級索引;count指標計數
var point = {};
var result = [];
var pIndex = null;
var tempCount = 0;
var temp = [];
//根據引數列生成指標物件
for (var index in list) {
if (typeof list[index] == "object") {
point[index] = {
"parent": pIndex,
"count": 0
}
pIndex = index;
}
}
//單維度資料結構直接返回
if (pIndex == null) {
return list;
}
//動態生成笛卡爾積
while (true) {
for (var index in list) {
tempCount = point[index]["count"];
temp.push(list[index][tempCount]);
}
//壓入結果陣列
result.push(temp);
temp = [];
//檢查指標最大值問題
while (true) {
if (point[index]["count"] + 1 >= list[index].length) {
point[index]["count"] = 0;
pIndex = point[index]["parent"];
if (pIndex == null) {
return result;
}
//賦值parent進行再次檢查
index = pIndex;
} else {
point[index]["count"]++;
break;
}
}
}
}
呼叫方法:
var result = descartes({"aa":["a","b","c","d"],"bb":["$","%","^","&"]});
alert(result);//result就是笛卡爾積