zoukankan      html  css  js  c++  java
  • 一次生产上的灵感 二进制运算思路

    二进制 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位运算,复杂度可以忽略不计。

  • 相关阅读:
    bzoj1467 Pku3243 clever Y
    bzoj2242 [SDOI2011]计算器
    卡特兰数
    洛谷P1290 欧几里得的游戏
    bzoj2277 [Poi2011]Strongbox
    poj2406 Power Strings
    Codeforces 892 D.Gluttony
    Codeforces 892 C.Pride
    Codeforces 892 B.Wrath
    Codeforces 892 A.Greed
  • 原文地址:https://www.cnblogs.com/Roysatm/p/6736364.html
Copyright © 2011-2022 走看看