Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การหา Partition ทั้งหมดของ Multiset ที่แต่ละส่วนมีองค์ประกอบไม่ซ้ำกันด้วย JavaScript

สมมติเรามีอาร์เรย์แบบนี้:

const arr = [A, A, B, B, C, C, D, E];

เราจำเป็นต้องสร้างอัลกอริทึมที่หา combinations ทั้งหมดที่รวมกันแล้วได้อาร์เรย์ทั้งหมด โดยไม่มีองค์ประกอบซ้ำในแต่ละส่วน

ตัวอย่าง combinations:

[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] เป็น combinations เดียวกัน ลำดับใน subset ไม่สำคัญเช่นกัน

เช่น [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]]