算法实战:用回溯算法计算商品所有的SKU!

回溯算法:本质上是一种深度优先搜索算法,类似枚举的搜索尝试过程,当发现不满足条件时,就回到上一步,尝试其他解法

回溯法,一般可以解决如下几种问题:

排列问题:N个数按一定规则全排列,有几种排列方式
子集问题:集合里有多少符合条件的子集
棋盘问题:N皇后,解数独等等

算法框架

function backTrack (选择列表,路径) {
   if (满足结束条件) {
       得到结果
   }
   for i in 列表 {
      if (满足剪支条件) {
         continue;
      }
      选择列表加入路径
      backtrack(选择列表,路径)
      撤销选择
   }
}

现有商品规格如下:

在这里插入图片描述

我们将上图抽象为树形结构,用代码表示如下:

const data = [{
  "value": "颜色",
    "list": [
      { "value": "红" },
      { "value": "白" }
    ]}, {
    "value": "大小",
    "list": [
      { "value": "s" },
      { "value": "m" }
    ]}
  ]

用回溯算法生成SKU的所有组合

  function getSKU (specList) {
    const len = specList.length
    if (len === 0) return []
    const result = [];
    const temp = {}
    function backTrack (index) {
      if(index >= len) {
        result.push({...temp}) // 每项规格遍历完成后,就把组合的结果(temp)存到result数组
        return // 返回到上一层
      }
      const { value: specName, list: attrList } = specList[index];
      for (const attr of attrList) { // 遍历当前规格的每项属性
        temp[specName] = attr.value; // 按照{'规格名称': '属性值'}存放到temp对象
        backTrack(index + 1); // 遍历下一项规格,获取下一项规格的属性值
      }
    }
    backTrack(0);
    return result;
  }

得到结果:

  [ 
    { "颜色": "红", "大小": "s" },
    { "颜色": "红", "大小": "m" },
    { "颜色": "白", "大小": "s" },
    { "颜色": "白", "大小": "m" }
  ]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值