导航:首页 > 源码编译 > 商品多规格算法

商品多规格算法

发布时间:2023-10-25 19:49:08

⑴ 淘宝sku算法浅析

        最近项目遇到了一个难题,就是模仿淘宝上的选择规格,首先我先来解释下什么是sku,sku(Stock Keeping Unit 库存量单位)即库存进出计量的基本单元,可以是以件,盒,托盘等为单位。sku这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。上面的话可能你们没有听懂是什么意思,具体请打开手淘,选择服装类的产品(由于服装类的产品可选规格较多,比较容易进行比较)。
        当时项目开始并不是采用这个sku算法,而是采用遍历查询的方式,将所有结果进行拆分,拆分成几个不同属性的集合;例如颜色、内存、大小等;然后通过用户点击按钮,去遍历后台有无包括这种规格的商品(除了库存为0);如果没有则把按钮变成灰色(即改变状态);让我们来分析下这种方案的优缺点。

尺寸:5.0寸、4.5寸
型号:土豪金、红、黑
内存:128G、64G

        现在这几种类型一共有2 * 3 * 2 = 12种排列组合,然而只有3种组合是正确的(其中还要排除库存为0的情况)一开始先保存好每一个按钮和每一列的位置进入一个List<List<TagEnable>> 的数组中,TagEnable记录着每一个按钮的状态(0代表者正常,1代表选中,2代表不可选(库存为0||无规格));然后当用户点击的时候,用Map<Integer,String> 记录选中的按钮和文字;并把每一个按钮先设置为不可点击,之后根据文字去对按钮进行设置状态。
        这种算法是比较直接的一种实现,但是很繁琐,循环嵌套循环,可以简单分析下算法复杂度,如果sku属性组合元素的总和数用m来表示,可选的数据的长度是n的话,那么算法的步骤大概是m*n,这看起来好像不怎么复杂;不过,每次判断一个sku组合是否和result中的 组合匹配,却不是一个简单的过程,实际上,这可以看做是一个字符串匹配的一个算法了, 最简单的还是使用正则匹配,m * n次正则匹配,这样就不怎么快了吧。正则表达式很不稳定,万一sku组合中有一些特殊字符,就可能导致一个正则匹配没能匹配到我们想要的表达式。
而且,当用户全部选中的时候,根据这种算法,只会出现一种情况,就是未选中的全部都变成不可选(即变成灰色),这大大影响了用户的体验。如下图:

        sku算法是利用数学的集合思想来写的。即先把可能的排列组合列出来,即取出集合中的所有子集,数学上叫做幂集。
就是如果第一条数据["5.0寸", "黑", "128G"]可选,
那么以下的组合肯定存在:

例如:当用户进行如下的选择:5.0寸、128G
那么如何判断 4.5寸这个按钮的状态呢?只需判断4.5寸、128G是否可选(集合U是否存在(4.5寸-128G)这个组合并且库存不为0),以此类推:

于是乎,我们可以得出下列的结果:

在使用淘宝的过程中,我发现他们可以根据用户选择按钮的唯一值确定图像(例如在这案例中,颜色是唯一的),当用户只选择唯一值时,便可以确定其图像

做法是这样子的:先遍历原始数据,如果用户选择的组合在原数据中是唯一的话,则可以确定其图像。

https://github.com/hfkai/SkuSelects

⑵ ios SKU 组合算法

通俗来讲,一个SKU 就是商品在规格上的一种组合,比如说,一件衣服 有红色 M号的 也有蓝色 L号的 ,不同的组合就是不同的SKU

近段时间,刚好遇到要在商品详情页购买商品的时候,实现选择不同规格组合的sku,预判无库存sku选项置灰,减少客户不必要sku的选择。

网上搜寻了一大批有关sku选择算法的文章,然后被各路大神的一顿操作秀得一脸懵逼,简单来说就是没看懂。。。

当然基于以上参考得到的灵感,终于总结出来了一种简单易用通俗易懂的sku选择算法,思路简单,唯一的bug是sku数据有n多层的时候,计算量大耗内存。当然现在手机的运算能力都是杠杠的,正常来说商品的sku也不会有几十上百层那么夸张。

接下来我先捋一下思路吧!

Tips: sku 有三种状态,可选(正常),不可选(置灰),已选中(高亮),

一,sku算法初版:计算所有sku的组合 与 有库存sku的组合的交集,交集里面的sku为可选项,反之其他sku为不可选。

 1.计算所有sku的组合-->集合A

A = ["34,61,66"  , "34,61,67"  , ......]

2.计算有库存的sku的组合 -->集合B

一般是从后台服务器返回的 eg:

3. 计算集合A与集合B的交集,交集里面的所有元素就是初始时所有可选sku ID ,反之其他sku ID就是置灰(无库存不可选状态)

4.以上三步就是简易的sku算法核心思路,弹出规格框时,计算集合A和集合B的交集,得到初步赛选结果,告诉客户,哪些sku无库存不可选置灰显示,可选的为正常状态显示,减少客户做不必要的选择操作。

5.当然,细心的你很快就会发现这样的sku算法会导致无法判断出,已选sku的兄弟节点是否可选的bug。

二,优化兄弟节点的可选状态判断bug

1.如上图 已选Platform 属性的 34,长度属性的 62 , 我们要判断的已选sku兄弟节点属性分别是Platform 属性的 35,长度属性的 61。 

2.即:

要判断 长度属性的 61是否为可选,就要判断,34,61这样的组合是否属于有库存组合里面子集,是:可选,不是: 不可选。

同理:

要判断 Platform 属性的 35是否为可选,就要判断,35,62这样的组合是否属于有库存组合里面子集,是:可选,不是: 不可选。

3.细心的你肯定发现了规律,34,61 或者 35,62 这样的组合都有一个共同点

即:包含n个已选skuID,n = 已选sku个数-1 .

三,计算兄弟节点是否可选

1,计算已选sku ID 同类属性的组合 ==集合C  即:计算Platform 属性和长度属性的组合

集合C = ["34,61","34,62","35,61","35,61","35,62"]

2.计算已选skuID的子集 ==集合D 即:计算 [34,62]的子集 

集合D = ["34","62","34,62"]

3.从集合D里面筛选出,含有n个已选skuID的子集(n = 已选sku个数-1 )==集合E

集合E = ["34","62"]

4.最后计算可选兄弟节点组合,集合C里面的组合只要是含有集合E里面的元素都是可选兄弟节点组合

可选兄弟节点组合F = 【集合C里面的组合只要是含有集合E里面的元素】

5. 

兄弟节点可选skuID =  【(集合A与集合B的交集的skuID集合)再与 集合F 的并集 】

四,整理

1.筛选有库存的sku组合为可选sku 其余为不可选sku

2.计算兄弟节点可选sku

3.可选sku正常显示,不可选sku置灰,已选sku高亮

附Demo: sku算法demo

五,拓展一下

阅读全文

与商品多规格算法相关的资料

热点内容
用粘液做解压手套 浏览:326
icloud收信服务器地址 浏览:498
编程思考者 浏览:450
压缩机型号用什么氟利昂 浏览:553
农机空气压缩机 浏览:664
程序员下载歌曲 浏览:894
编译未检测到仿真器 浏览:807
压缩机每次启动12分钟就停 浏览:730
creo复制曲面命令 浏览:959
程序员恋上女硕士 浏览:669
ansys的get命令 浏览:988
国外dns苹果服务器地址 浏览:430
国家职业技术资格证书程序员 浏览:652
奇瑞租车app是什么 浏览:99
系统源码安装说明 浏览:420
命令行加壳 浏览:96
解压时显示防失效视频已加密 浏览:295
苹果短信加密发送 浏览:446
天翼私有云服务器租用 浏览:733
贵州云服务器属于哪个上市公司 浏览:59