商品SKU

article/2025/10/3 9:45:42

前言

        最近项目开发涉及商品SKU,商品SKU计算原理就是笛卡尔积,下面对相关内容做一下总结。

一、什么是SKU

        SKU=Stock Keeping Unit(库存量单位),即库存进出计量的单位,可以是以件,盒,托盘等为单位。针对电商而言,一款商品SKU主要由商品规格组合,后面会举例子说明。
 

、什么是笛卡尔积

        笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 。

        假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

        这里针对商品举例说明,假设衣服由2个规格组成:颜色(黑色、白色)、尺寸(S、M、L),则根据SKU定义和笛卡尔积原理,生成SKU如下:

{('黑色', 'S'), ('黑色', 'M'), ('黑色', 'M'), ('白色', 'S'), ('白色', 'M'), ('白色', 'L')}

三、代码实现

        通过上面介绍,我们简单SKU和笛卡尔积,我们知道2个集合怎么生成SKU,但如果3个集合,怎么使用笛卡尔积实现SKU呢。这里我们可以采用分治的方案。就是先把两个集合生成SKU,作为一个集合,再和下一个集合进行笛卡尔积,这样就可以实现三个集合及以上问题。

1.第一方案

type GoodsSpec struct {Id   int64  `json:"id"`Name string `json:"name"`
}func main() {// 颜色colorSpec := []GoodsSpec{{Id:   1,Name: "白色",},{Id:   2,Name: "黑色",},}// 尺寸sizeSpec := []GoodsSpec{{Id:   3,Name: "S",},{Id:   4,Name: "M",},{Id:   5,Name: "L",},}// 产地fieldSpec := []GoodsSpec{{Id:   9,Name: "杭州",},{Id:   10,Name: "北京",},}skus := GenerateSku(colorSpec, sizeSpec, fieldSpec)for _, sku := range skus {log.Printf("%+v", sku)}
}func GenerateSku(specs ...[]GoodsSpec) [][]GoodsSpec {skus := make([][]GoodsSpec, 0)for _, spec := range specs[0] {skus = append(skus, []GoodsSpec{spec})}for i := 0; i < len(specs)-1; i++ {skuTemp := make([][]GoodsSpec, 0)for _, sku := range skus {for _, spec := range specs[i+1] {temp := make([]GoodsSpec, 0)temp = append(temp, sku...)temp = append(temp, spec)skuTemp = append(skuTemp, temp)}}skus = skuTemp}return skus
}

运行结果:

2.第二方案

type GoodsSpec struct {Id   int64  `json:"id"`Name string `json:"name"`
}func main() {// 颜色colorSpec := []GoodsSpec{{Id:   1,Name: "白色",},{Id:   2,Name: "黑色",},}// 尺寸sizeSpec := []GoodsSpec{{Id:   3,Name: "S",},{Id:   4,Name: "M",},{Id:   5,Name: "L",},}// 产地fieldSpec := []GoodsSpec{{Id:   6,Name: "杭州",},{Id:   7,Name: "北京",},}sets := GenerateSku(colorSpec, sizeSpec, fieldSpec)for _, set := range sets {fmt.Printf("%+v\n", set)}
}func GenerateSku(specs ...[]GoodsSpec) [][]GoodsSpec {lens := func(i int) int {log.Printf("%+v", i)return len(specs[i])}var skus [][]GoodsSpecfor ix := make([]int, len(specs)); ix[0] < lens(0); nextIndex(ix, lens) {var r []GoodsSpecfor j, k := range ix {r = append(r, specs[j][k])}skus = append(skus, r)}return skus
}func nextIndex(ix []int, lens func(i int) int) {for j := len(ix) - 1; j >= 0; j-- {ix[j]++if j == 0 || ix[j] < lens(j) {return}ix[j] = 0}
}

运行结果:

总结

1.先计算第一个集合和第二个集合的笛卡尔积,把结果保存为一个新集合。
2.然后再用新集合与下一个集合计算笛卡尔积,依此循环直到与最后一个集合计算笛卡尔积。


http://chatgpt.dhexx.cn/article/MT64hEvV.shtml

相关文章

深度学习(二)---算法岗面试题

● 神经网络为什么用交叉熵 参考回答&#xff1a; 通过神经网络解决多分类问题时&#xff0c;最常用的一种方式就是在最后一层设置n个输出节点&#xff0c;无论在浅层神经网络还是在CNN中都是如此&#xff0c;比如&#xff0c;在AlexNet中最后的输出层有1000个节点&#xff0c…

深度学习面试题常见问答

目录 有哪些方法可以避免过拟合? 造成过拟合的原因&#xff1a; 解决办法&#xff1a; dropout在训练时和推理时的区别是什么&#xff1f; L1和L2正则化的区别&#xff1f;为什么L1比L2更稀疏&#xff1f; Batch Size大小如何影响收敛速度&#xff1f; BN的原理&#x…

机器学习、深度学习笔试题面试题整理

机器学习、深度学习笔试题 面试题总结 整理看到的内容&#xff0c;以免忘记 里面添加参考的链接&#xff0c;感谢各位大佬 感受野如何计算&#xff1f; 参考链接&#xff1a;https://blog.csdn.net/a841454735/article/details/88558906 感受野指的是一个特定的 CNN 特征&am…

深度学习(三)----算法岗面试题

● 神经网络为啥用交叉熵。 参考回答&#xff1a; 通过神经网络解决多分类问题时&#xff0c;最常用的一种方式就是在最后一层设置n个输出节点&#xff0c;无论在浅层神经网络还是在CNN中都是如此&#xff0c;比如&#xff0c;在AlexNet中最后的输出层有1000个节点&#xff0c;…

深度学习(二)-----算法岗面试题

● 深度学习了解多少&#xff0c;有看过底层代码吗&#xff1f;caffe,tf? ● 除了GMM-HMM&#xff0c;你了解深度学习在语音识别中的应用吗&#xff1f; 参考回答&#xff1a; 讲了我用的过DNN-HMM&#xff0c;以及与GMM-HMM的联系与区别&#xff1b;然后RNNCTC&#xff0c;这…

深度学习面试题-2

1. 下列哪一项属于特征学习算法&#xff08;representation learning algorithm&#xff09;&#xff1f; A K近邻算法 B 随机森林 C 神经网络 D 都不属于 正确答案是&#xff1a;C&#xff0c; 您的选择是&#xff1a;C 解析&#xff1a;神经网络会将数据转化为更适合解决目…

深度学习面试题总结1-20

1.CNN的卷积核是单层还是多层的&#xff1f; 描述网络模型中某层的厚度&#xff0c;通常用名词通道channel数或者特征图feature map数。不过人们更习惯把作为数据输入的前层的厚度称之为通道数&#xff08;比如RGB三色图层称为输入通道数为3&#xff09;&#xff0c;把作为卷积…

深度学习计算机视觉常见的29道面试题及解析

点击上方&#xff0c;选择星标或置顶&#xff0c;不定期资源大放送&#xff01; 阅读大概需要15分钟 Follow小博主&#xff0c;每天更新前沿干货 作者丨我要鼓励娜扎知乎 来源丨https://zhuanlan.zhihu.com/p/89587997 编辑丨极市平台 导读 正值秋招进行时&#xff0c;本文收集…

深度学习面试题-3

1. 梯度爆炸问题是指在训练深度神经网络的时候&#xff0c;梯度变得过大而损失函数变为无穷。在RNN中&#xff0c;下面哪种方法可以较好地处理梯度爆炸问题&#xff1f; A 用改良的网络结构比如LSTM和GRUs B 梯度裁剪 C Dropout D 所有方法都不行 正确答案是&#xff1a;B&am…

深度学习算法面试题总结(38题)

原文链接:https://blog.csdn.net/attitude_yu/article/details/80963323 1. 什么是凸集、凸函数、凸学习问题&#xff1f; 凸集&#xff1a;若对集合C中任意两点u和v&#xff0c;连接他们的线段仍在集合C中&#xff0c;那么集合C是凸集。 公式表示为&#xff1a;αu(1-α)v∈C…

深度学习笔试、面试题 一

1、神经网络模型&#xff08;Neural Network&#xff09;因受人类大脑的启发而得名&#xff0c;神经网络由许多神经元&#xff08;Neuron&#xff09;组成&#xff0c;每个神经元接受一个输入&#xff0c;对输入进行处理后给出一个输出&#xff0c;如下图所示。请问下列关于神经…

面试笔试整理3:深度学习机器学习面试问题准备(必会)

第一部分&#xff1a;深度学习 1、神经网络基础问题 &#xff08;1&#xff09;Backpropagation&#xff08;要能推倒&#xff09;   后向传播是在求解损失函数L对参数w求导时候用到的方法&#xff0c;目的是通过链式法则对参数进行一层一层的求导。这里重点强调&#xff…

机器学习与深度学习常见面试题

为了帮助参加校园招聘、社招的同学更好的准备面试&#xff0c;SIGAI整理出了一些常见的机器学习、深度学习面试题。理解它们&#xff0c;对你通过技术面试非常有帮助&#xff0c;当然&#xff0c;我们不能只限于会做这些题目&#xff0c;最终的目标是真正理解机器学习与深度学习…

深度学习最全面试题总结(二)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。✨公众号&#xff1a;GoAI的学习小屋 &#xff0c;免费分享书籍、简历、导图等&#xf…

大厂必考深度学习面试题及参考答案

目录 一&#xff0c;滤波器与卷积核二&#xff0c;卷积层和池化输出大小计算 2.1&#xff0c;CNN 中术语解释2.2&#xff0c;卷积输出大小计算&#xff08;简化型&#xff09;2.3&#xff0c;理解边界效应与填充 padding参考资料三&#xff0c;深度学习框架的张量形状格式四&am…

深度学习面试必备的25个问题

作者 | Tomer Amit 译者 | 弯月&#xff0c;编辑 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在本文中&#xff0c;我将分享有关深度学习的25个问题&#xff0c;希望能够帮助你为面试做好准备。 1.为什么必须在神经网络中引入非线性&#xff1f; 答&am…

深度学习算法面试题总结

1. 什么是凸集、凸函数、凸学习问题? 凸集:若对集合C中任意两点u和v,连接他们的线段仍在集合C中,那么集合C是凸集。 公式表示为:αu+(1-α)v∈C α∈[0, 1] 凸函数:凸集上的函数是凸函数。凸函数的每一个局部极小值也是全局极小值( f(x) = 0.5x^2 )。 公式表示为:f(αu…

用python计算n的阶乘的方法!(含示例代码)

前言&#xff1a; 今天为大家的内容是&#xff1a;用python计算n的阶乘的方法&#xff01;&#xff08;含示例代码&#xff09;希望通过本文内容能够对各位有所帮助&#xff0c;要是喜欢的话记得点赞转发收藏关注不迷路哦&#xff01;&#xff01;&#xff01; 提示&#xff…

python计算n的阶乘

1.程序 n int(input())def fact(n):if n 0 | n 1:return 1elif n > 1:return n * fact(n - 1)print(fact(n)) 2.分析 首先&#xff0c;阶乘本身就是一个递归问题&#xff0c;那最好的方法就是写一个递归函数&#xff0c;即函数调用自身&#xff0c;递归函数一定要有基…

Python应用之计算阶乘

1.背景知识 阶乘是基斯顿卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,通俗的讲也就是按顺序从1乘到n,所得的那个数就是n的阶乘。0的阶乘为1,自然数n的阶乘写作n!。即:0!= 11!= 12!= …