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


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

  • 相关阅读:
    Windows API Reference for C#, VB.NET and VB6
    工程建设项目综合信息管理系统
    GridView,Repeater分页控件:WebPager 开源了
    asp.net服务器控件开发学习之路(一)
    ajaxToolkit:TabContainer 背景色的设置
    TreeView 树结构的断层处理
    C# 集合类(二):Queue
    AutoCAD.net(三)用VS.NET2005开发ObjectARX程序 调试方法
    AutoCAD.net(一):更改AutoCAD窗口的标题和图标
    C# 集合类(四):Hashtable
  • 原文地址:https://www.cnblogs.com/Roysatm/p/6736364.html
Copyright © 2020-2023  润新知