基于质因数分解的Sku实现方式

0 业务场景

image

服务器返回数据:

// 数据1
[
    {"颜色" : "绿色", "款式" : "2018款", "尺码" : "M", "sku_id" : "1"},
    {"颜色" : "红色", "款式" : "2016款", "尺码" : "M", "sku_id" : "2"},
    {"颜色" : "绿色", "款式" : "2016款", "尺码" : "S", "sku_id" : "3"},
    {"颜色" : "蓝色", "款式" : "2017款", "尺码" : "L", "sku_id" : "4"},
    {"颜色" : "绿色", "款式" : "2018款", "尺码" : "L", "sku_id" : "5"}
]

当然中间还能添加sku库存或者价格之类的参数如下,但是本文不涉及此类内容

{@"颜色" : @"绿色", @"款式" : @"2018款", @"尺码" : @"M", @"sku_stock" : @"10", @"sku_price" : @"20.00", @"sku_id" : @"1"},

先将服务器返回数据进行group处理,处理后格式如下:

// 数据2
["颜色", "款式", "尺码"]

这时候需要列举出所有组合路径,形成一个笛卡尔积

// 数据3
[
    ["绿色", "2016款", "S"],   // 可选
    ["绿色", "2016款", "M"],
    ["绿色", "2016款", "L"],
    ["绿色", "2017款", "S"],
    ["绿色", "2017款", "M"],
    ["绿色", "2017款", "L"],
    ["绿色", "2018款", "S"],
    ["绿色", "2018款", "M"],   // 可选
    ["绿色", "2018款", "L"],   // 可选
    
    ["红色", "2016款", "S"],
    ["红色", "2016款", "M"],   // 可选
    ["红色", "2016款", "L"],
    ["红色", "2017款", "S"],
    ["红色", "2017款", "M"],
    ["红色", "2017款", "L"],
    ["红色", "2018款", "S"],
    ["红色", "2018款", "M"],
    ["红色", "2018款", "L"],
    
    ["蓝色", "2016款", "S"],
    ["蓝色", "2016款", "M"],
    ["蓝色", "2016款", "L"],
    ["蓝色", "2017款", "S"],
    ["蓝色", "2017款", "M"],
    ["蓝色", "2017款", "L"],   // 可选
    ["蓝色", "2018款", "S"],
    ["蓝色", "2018款", "M"],
    ["蓝色", "2018款", "L"],
]

1 问题描述:

术语确定:

路径: 如"蓝色", "2016款", "S" 一种能够确定商品类型的选择

sku单元: 如 "蓝色" 一种能选择的最小单位

sku单元组: 如 {"颜色" : ["绿色", "红色", "蓝色"]} 一种规格的名称,及其规格下所有可选参数组成的集合

路径总数为每个sku单元组下可选参数数量的累乘,此🌰中为 3 * 3 * 3 = 27种路径.到此为止都只是很简单的计算.

难点在于不是每种sku都可选,必须要将不可选的路径给置灰,否则容易造成用户的误解,以下介绍2中开发思路.

建议都进行阅读并对比两种思路的优劣.

1 常规开发思想

Sku 多维属性状态判断算法

2 利用质因数分解的方式进行开发

不同于上一种方式的多级遍历,此种方式利用任何数的质因数分解的结果唯一性去判断路径,比上一种方式的算法复杂度更低.

数据1转化为以下格式

// 数据4
[["绿色", "红色", "蓝色"],  ["2016款", "2017款", "2018款"],  ["S", "M", "L"]]

数据4按顺序转化为质数

// 数据5
[[2, 3, 5],  [7, 11, 13],  [17, 19, 23]]

根据数据1数据5获得可行路径下每个sku选项对应质数的乘积

// 数据6
// {"颜色" : "绿色", "款式" : "2018款", "尺码" : "M", "sku_id" : "1", "prime" : 494},
// {"颜色" : "红色", "款式" : "2016款", "尺码" : "M", "sku_id" : "2", "prime"},
// {"颜色" : "绿色", "款式" : "2016款", "尺码" : "S", "sku_id" : "3"},
// {"颜色" : "蓝色", "款式" : "2017款", "尺码" : "L", "sku_id" : "4"},
// {"颜色" : "绿色", "款式" : "2018款", "尺码" : "L", "sku_id" : "5"}
// 绿 - 2018 - M = 2 * 13 * 19 = 494
// 红 - 2016 - M = 3 * 7  * 19 = 399
// 绿 - 2016 - S = 2 * 7  * 17 = 238
// 蓝 - 2017 - L = 5 * 11 * 23 = 1265
// 绿 - 2018 - L = 2 * 13 * 23 = 598

[494, 399, 238, 1265, 598]

然后维护一个每个sku单元组当前选中的质数(如果未选则为1)的数组,格式如下:

// 数据7
// 全不选
[1, 1, 1]
// 红 - 没选 - L
[3, 1, 23]
// 没选 - 2017 -M
[1, 11, 19]

假如都没选的情况下,点击了选中了绿色+L.则数据7

// 数据7的转化
[1, 1, 1] -> [2, 1, 23] 

此时开始可以计算每个sku单元状态的调整:

每个 sku单元分为3中状态

状态1.选中
image

状态2:可选
image

状态3.不可选
image

计算流程如下:

1.通过判断sku单元对应的质数是否在数据7中出现来确定是否是状态1,如果存在则返回状态1. 如果不存在则继续进行计算

2.对数据7进行魔改将sku单元所在行的质数改为自己对应的字数并记录在一个临时数据8

// 数据7此时状态
[2, 1, 23] 
// 对于"红色"数据8为
[3, 1, 23]
// 对于"M"数据8为
[2, 1, 19]
// 对于"2018" 数据9为
[2, 13, 23] 
// ...

3.将每个sku单元数据8中的数据累乘并记录一个临时数据9

// 数据7此时状态
[2, 1, 23] 
// 对于"红色"数据9为
3 * 1  * 23 = 69
// 对于"M"数据8为
2 * 1  * 19 = 38
// 对于"2018" 数据9为
2 * 13 * 23  = 598
// ...

4.每个sku单元用自己的数据9去对数据6中的数据进行除法运算如果能整除则为状态2反之为状态3

// "红色" 数据9: 69
无整除结果返回状态3
// "M" 数据9: 38
存在可以整除的数494 返回状态2
// "2018" 数据9: 598
存在可以整除的数598 返回状态2
  1. 结果如图:

    image-201804201142358的副本.png

Demo地址

skuDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,950评论 6 13
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 3,859评论 1 22
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 做新媒体,不怕慢,就怕乱——在开始之前,先要有个清晰的定位,然后做出系统的规划,接下来才是具体的执行。 提炼资源的...
    红满阅读 232评论 0 1
  • 有那么一首歌,不再见。 可却没有一件事情会不再见,没有两个人可以不再见。 曾经无数次预想这一天的来临,却不曾想是如...
    不给糖果就捣蛋阅读 163评论 0 0