一次生产上的灵感 二进制运算思路

二进制 0 和 1,曾经刷过一些算法,也经常遇到需要使用01解决问题的算法。刷过一些OJ,对二进制的使用有一些了解。但在实际项目中从未使用过二进制的特性,最近公司生产遇到过这样一个问题,于是突发灵感使用二进制设计。

 

问题:在数据库一张表有这样一个字段用来区分这行数据,举个例子假如有个电商,可以通过 ios客户端, android客户端, 浏览器 三种方式访问该电商的商品。但这个电商很特殊经常只在某一端搞活动,假如该电商卖一款阿迪达斯的鞋子只在 ios客户端展示并可购买,但 android客户端,和浏览器压根就不展示这款阿迪达斯的鞋子,在商品表结构上设计需要一个字段(假设名为type)用来区分这个商品在某个终端是否展示。问题来了该怎么设计?

现在分析下商品可能展示的部分情况:

ios客户端  展示,   android客户端 不展示,   浏览器不展示  type存储 '1'

ios客户端  展示,   android客户端 展示,   浏览器不展示    type存储 '1,2'

ios客户端  不展示,   android客户端 展示,   浏览器不展示 type存储 '3'

 

我看公司之前的表结构设计使用varchar类型存储type,使用like模糊查询进行匹配。

问题来了:

1》我们知道使用模糊查询‘%’和‘_’开头的前缀字符串是无法使用索引的

2》假如使用like '%2,3%'匹配所有android客户端, 浏览器 而数据库存储的是 '3,2' 那么是无论如何也查不出来的

 

使用 & 和 | 运算 思路来解决,type为整型存储

 ios客户端 1 001

android客户端 2  010

浏览器 4 100

 

ios客户端  展示,   android客户端 不展示,   浏览器不展示  type存储  1

ios客户端  展示,   android客户端 展示,   浏览器不展示    type存储  3 = 1 | 2

ios客户端  不展示,   android客户端 展示,   浏览器不展示 type存储  2

 

 

那么当SQL语句where条件是如何匹配, 

查询ios客户端展示的 where 1 = type & 1

查询ios客户端和android客户端 同时展示的 where 3 = type & 3

 

并且使用二进制思路进行存储type还可以使用索引,不会出现顺序出错无法匹配问题。我们都知道字符串匹配是有空间和时间复杂度的有的是时间换空间,有的是空间换时间不管怎样的算法,时间和空间复杂度都不会小于O(n)。而使用二进制思路时间和空间复杂度都是O(1), 只进行一次CPU位运算,复杂度可以忽略不计。

posted @ 2017-04-19 22:50  roysatm  阅读(308)  评论(0编辑  收藏  举报