0
点赞
收藏
分享

微信扫一扫

golang查询指定集合中的一个元素的所有子集

芥子书屋 2022-03-30 阅读 136

golang查询指定集合中的一个元素的所有子集

使用场景

1.使用二进制存储状态到数据库字段, 现需要进行查询
2.查找一个类型商品的全部组合形式

代码

1.查找指定元素位置的代码

// 查询需要查询元素的位置对应的二进制 转换后的十进制数  
// 入参: 需要查询的数 如:3  
// 找出3在集合中的位置, 0100  
func findSubLoc(set []int,f int) int{  
 targetLoc := 0  
 for k,v := range set {  
 if v == f {  
 targetLoc = 1 << (k)  
 break  
 }  
 } return targetLoc  
}

2.查询集合的子集个数

// 查询集合位置的所有子集  
func findAllSubLocLen(set []int) int {  
 // 将集合拆分为子集应有 2^(集合长度-1) 个子集  
 setLen,_ := strconv.ParseFloat(fmt.Sprintf("%d", len(set)), 64)  
 subLen := int(math.Pow(2.0, setLen))  
 return subLen  
}

3.将子集转换为集合中的元素

// 入参: 5
// 结果: [1,3]  
func obToSlice(d int) []int {  
 res := make([]int, 0)  
 i := 1  
 flag := true  
 for flag {  
 if d == 0 {  
 flag = false  
 break  
 }  
 if d & 1 != 0 {  
 res = append(res, i)  
 } i++  
 d = d >> 1  
 }  
 return res  
}

4.使用

func main()  {  
 // 初始化集合  
 set := []int{1,2,3,4}  
 // 包含有3的所有子集  
 // 计算3的位置  
 targetLoc := findSubLoc(set, 3)  
 fmt.Printf("targetLoc:%d,%08b\n",targetLoc,targetLoc)  
 // 将集合拆分为子集应有 2^(集合长度-1) 个子集  
 n := findAllSubLocLen(set)  
 // 记录位置子集  
 subLoc := make([]int, 0)  
 // 打印出子集  
 for i := 0;i < n;i++{  
 // 如果查找位置与位置子集相与为查找位置, 则记录该子集  
 if targetLoc & i == targetLoc {  
 fmt.Printf("%08b,%08b\n",targetLoc,i)  
 subLoc = append(subLoc, i)  
 } } fmt.Printf("subLoc:%d, %08b\n",subLoc, subLoc)  
 // 将子集转换为集合数据  
 for _,v := range subLoc {  
 fmt.Println(obToSlice(v))  
 }
}
举报

相关推荐

0 条评论