类功能位置层级的二进制位集分配算法及SQL查询适配需求
层级位集分配算法解决方案
问题分析
当前的位集分配方式是每个层级独立从低位开始分配,导致不同分支的同层级节点位掩码重复(比如Plant B下的Building C和Plant A的位掩码都是00000001),无法通过按位与操作精准筛选出指定父节点下的所有子节点。
正确的位集分配算法:路径累积掩码
核心思路是每个节点的位集包含其父节点的所有位掩码,同时新增一个独属于自身的位,这样子节点的位集天然包含父节点的位信息,按位与操作就能准确匹配出所有下级节点。
重新分配后的位集示例
1.0 Plant A 00000001 (第0位) 1.1 Building A 00000011 (父节点位 | 第1位) 1.1.1 Room 1 00000111 (父节点位 | 第2位) 1.1.2 Room 2 00001011 (父节点位 | 第3位) 1.2 Building B 00010001 (父节点位 | 第4位) 1.2.1 Room 3 00110001 (父节点位 | 第5位) 1.2.2 Room 4 01010001 (父节点位 | 第6位) 2.0 Plant B 10000000 (第7位) 2.1 Building C 10000001 (父节点位 | 第0位) 2.1.1 Room 5 10000011 (父节点位 | 第1位) 2.1.2 Room 6 10000101 (父节点位 | 第2位) 2.2 Building D 10001000 (父节点位 | 第3位) 2.2.1 Room 7 10011000 (父节点位 | 第4位) 2.2.2 Room 8 10101000 (父节点位 | 第5位)
算法步骤
- 根节点(Plant层):为每个根节点分配一个全局唯一的位(比如从低位到高位依次分配,确保不重复)。
- 子节点(Building/Room层):
- 继承父节点的完整位集;
- 分配一个未被父节点及同层级兄弟节点使用的新位;
- 将父节点位集与新位进行按位或操作,得到当前节点的位集。
验证SQL查询
查询Building A下的所有功能位置时,使用Building A的位集00000011作为掩码:
SELECT * FROM functional_locations WHERE (bitset & 0b00000011) = 0b00000011;
返回结果:
1.1 Building A 00000011 1.1.1 Room 1 00000111 1.1.2 Room 2 00001011
注意事项
- 位数量限制:如果节点数量多或层级深,需使用足够位数的整数类型(比如MySQL的
BIGINT是64位,可支持最多64个唯一节点位); - 位分配顺序:建议从低位到高位依次分配,避免浪费位资源;
- 唯一性保证:同层级的兄弟节点必须使用不同的位,确保每个节点的位集唯一且包含完整路径信息。
内容的提问来源于stack exchange,提问作者gpa
相关产品推荐
相关产品推荐

