位运算解决多标签问题

日常开发中经常用到一个酒店下有多个标签比如酒店的风格特点有:无柱?场地方正?豪华?美食?自然采光?园林草坪?温泉?景区周边?水景?泳池?中式院落?西式装修?少数民族 会场进车?高尔夫

我们一般都会对其进行编号:

{
    '1':  无柱,
    '2':  场地方正,
    '3':  豪华,
    '4':  美食,
    '5':  自然采光,
    '6':  园林草坪,
    '7':  温泉,
    '8':  景区周边,
    '9':  水景,
    '10': 泳池,
     '11': 中式院落,
    '12': 西式装修,
    '13': 少数民族,
    '14': 会场进车,
    '15': 高尔夫
}

存放在数据库时主要是存放该值的key值,如果一个酒店只有一个标签是没什么问题的,但是如果一个酒店有多个标签,并且又需要支持单个标签也可以筛选出该酒店就需要用到位运算,那具体这个位运算怎么设计呢?需要我们一起看看。

我们假设某个酒店存在 无柱 美食 泳池 三个标签
这样我们可以设计一个长度为15的二进制数,满足条件的位为1,不满足的为0,那该酒店的二进制数为 000001000001001
转换为十进制为 521
这样我们存放到数据库里面的数值为 521

那这样怎么获取该酒店是否有该标签呢?

我们可以采用位运算的与(&)运算:两个位都为1时,结果才为1

那如果我们要判断无柱这个标签是否存在该酒店
首先获取代表无柱的二进制数000000000000001
然后转换成10进制为1,
最后我们可以通过 tags & 1 来判断该酒店是否有无柱这个标签。

数据库查询语句为:

SELECT * from hotel_info WHERE (tags & 1);
SELECT * from hotel_info WHERE (tags & 4);
SELECT * from hotel_info WHERE (tags & 10);

好了,今天的分享就到这里,明天见

原文地址:https://www.cnblogs.com/jingh/p/10890969.html

时间: 2024-10-01 04:11:50

位运算解决多标签问题的相关文章

位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题

转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个数组,告诉你这些数字的范围是什么,然后让你查找这个缺失的数字(例如无序数组的范围是从1到10,不重复的9个数). 这类问题的解决方法比较多样,第一种,因为给定了范围可以通过计算数字总和值,然后分别减去这些数字,剩下的则是缺失的数字.第二种,对这个数组进行排序,遍历整个数组,然后判断相邻的元素是否连续

N皇后问题 --使用位运算解决

关键位运算 x & (-x) 取得最低位1 x & (x-1) 去掉最低位1 class Solution(object): def totalNQueens(self, n): """ :type n: int :rtype: int """ if n < 1 : return [] self.count = 0 self.DFS(n,0,0,0,0) return self.count def DFS(self,n, r

用位运算解决皇后问题以及皇后变体问题

问题描述: N皇后问题或者如下皇后变体问题: 在一个6*6的棋盘里放置4个互不攻击的车的方案数为多少?(阿里2016实习生在线笔试题) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int n,m,goal; int ans,sum; void DFS(int row,

leetcode:single-number-ii(Java位运算)

题目: Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 给定一个整型数组,每个数都出现了三次(只有一个数只出现了一次),找

多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )

如果你还是不太懂位运算,请看我的文章:那些年我们一起遗忘的位运算! 下面是我在这次项目中学习到的,我眼中的位运算的应用!主要是实现 通知的3个操作: 1.  置顶 2.  设为首页 3.  同时为 “置顶”+ “设为首页” 效果如图: 我们要想简便的进行位运算,我们可以直接进行如下枚举定义,以2的次方定义,应为他们的值很特殊: 数      二进制值 1 1 2   10 4       100 8    1000 16     10000 32     100000 64     100000

通过位运算来解决一些算法题

在刷pat的1073 多选题常见计分法题目时,发现如果需要判断每一个学生对应每道题的多选题是否错选,漏选,以及选对是比较麻烦的一件事,因为这涉及到两个集合的判断,判断一个集合是否是另一个集合的子集(即漏选,得一半的分),或者说两个集合是否完全相等(即题目得满分). 刚开始通过set容器来保存每一道题的正确答案,以及学生选择的答案,然后比较两个集合的大小,大小一致则for循环判断每一个元素是否都存在.结果发现这种思路过于复杂,且易超时. 联想到每一个选项是否一致,可以通过异或运算判断两个集合,如果

Java I/O : Bit Operation 位运算

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 泥瓦匠喜欢Java,文章总是扯扯Java. I/O 基础,就是二进制,也就是Bit. 一.Bit与二进制 什么是Bit(位)呢?位是CPU处理或者数据存储最小的单元.类似于很小很小的开关,一开一关,表示为1或者0.所以,这就是计算机处理任何数据的"细胞",要谨记.

POJ 1166 The Clocks 位运算与BFS

1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的状态所需要的最小操作数的操作方案: 2.输入输出:输入给出阵列初始状态,0,1,2,3分别表示0,3,6,9:要求输出最快方案的操作序列: 3.分析:IOI 1994的考题,BFS是比较容易想到的方法之一,关键是如何简洁的表示和改变BFS过程中的阵列状态:这里使用位运算的方法:具体如下: 首先一共9

N皇后问题(位运算实现)

本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版本以及注释分析. 皇后问题很经典,就不再赘述问题本身,解决皇后问题,一般采用的都是深搜DFS+回溯的方法,按照行(列)的顺序枚举每一个可以放置的情况,然后进行冲突判断,当前的放置是否合法,合法就继续搜索下一层,不合法就搜索就回溯.直到,找到一个合法的解,每一层都有一个皇后并且不发生冲突,这时候,放置