สมมติว่าเรามีอาร์เรย์ดังกล่าว −
const arr = [A, A, B, B, C, C, D, E];
เราจำเป็นต้องสร้างอัลกอริทึมเพื่อที่จะค้นหาชุดค่าผสมทั้งหมดที่รวมกันเป็นอาร์เรย์ทั้งหมด โดยที่องค์ประกอบจะไม่ซ้ำกัน
ตัวอย่างชุดค่าผสม −
[A, B, C, D, E] [A, B, C] [A, B, C, D] [A, B, C, E] [A, B, C] [A, B, C] [D, E]
คำอธิบาย
[A, B, C] [A, B, C] [D, E] และ [A, B, C] [D, E] [A, B, C] เป็นชุดค่าผสมเดียวกัน นอกจากนี้ การจัดลำดับด้วยชุดย่อยก็ไม่สำคัญเช่นกัน
ตัวอย่างเช่น − [A,B,C] และ [B,A,C] ควรเหมือนกัน
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const arr = [['A', 1], ['B', 2], ['C', 3]]; const spread = (arr, ind, combination) => { if (arr[1] === 0) return [combination]; if (ind === −1) return [combination.concat([arr])]; let result = []; for (let c=1; c<=Math.min(combination[ind][1], arr[1]); c++){ let comb = combination.map(x => x.slice()); if (c == comb[ind][1]){ comb[ind][0] += arr[0]; } else { comb[ind][1] −= c; comb.push([comb[ind][0] + arr[0], c]); } result = result.concat(spread([arr[0], arr[1] − c], ind − 1, comb)); } let comb = combination.map(x => x.slice()); return result.concat(spread(arr, ind − 1, comb)); }; const helper = arr => { function inner(ind){ if (ind === 0) return [[arr[0]]]; const combs = inner(ind − 1); let result = []; for (let comb of combs) result = result.concat( spread(arr[ind], comb.length − 1, comb)); return result; } return inner(arr.length − 1); }; const returnPattern = (arr = []) => { const rs = helper(arr); const set = new Set(); for (let r of rs){ const _r = JSON.stringify(r); if (set.has(_r)) console.log('Duplicate: ' + _r); set.add(_r); } let str = ''; for (let r of set) str += '\n' + r str += '\n\n'; return str; }; console.log(returnPattern(arr));
ผลลัพธ์
และผลลัพธ์ในคอนโซลจะเป็น −
[["ABC",1],["BC",1],["C",1]] [["AB",1],["BC",1],["C",2]] [["ABC",1],["B",1],["C",2]] [["AB",1],["B",1],["C",3]] [["AC",1],["B",1],["BC",1],["C",1]] [["A",1],["B",1],["BC",1],["C",2]] [["AC",1],["BC",2]] [["A",1],["BC",2],["C",1]] [["AC",1],["B",2],["C",2]] [["A",1],["B",2],["C",3]]