在地图上,有一些基站提供无线互联网接入服务,可以覆盖半径固定的基线区域,基站本身作为中心。
在同一张地图上的房屋中有一些无线信号接收器(称为c)。这些接收器固定在它们的位置。
假设每个基站可以在地图上表示为唯一的颜色。 对于每个接收器(c),如果它可以到达基站x,我们在地图上用站点x的颜色标记它。
最后,我需要按颜色对所有接收器进行分组。这意味着所有具有相同颜色的接收器都属于同一组。
我可以通过下表粗暴地解决问题。
table1:
base_station_color receiver_names
1 c1, c2, c3, c4, c5, c6
2 c1, c2, c3
3 c1, c2, c4
4 c3, c4 , c5, c6
5 c3, c4 , c5, c6
根据表格,c1和c2属于同一组,因为它们具有1,2,3的相同颜色组合。并且,C5,C6也属于同一组,因为它们的相同颜色组合为1,4,5。
但是,c3和c4不属于同一组,因为c3没有3的颜色,但是c4有。
然后,输出将如下:
table2
group, receiver_names,
gr1 c1, c2
gr2 c5, c6
gr3 c3
gr4 c4
最后,我只需要从每个组中选择一个接收器作为代表: e.g。
table3
group, receiver_names,
gr1 c1
gr2 c5
gr3 c3
gr4 c4
table3是最终输出。
table1的大小可能非常大,100万行和100k或100万个colmuns。
我无法在内存中保留如此大的文件。我不想在服务器上使用任何数据库。
是否有一些有效的算法来解决这个问题?
是否有一些特殊的哈希函数可以执行以下操作:
hash(c1, c2, c3) = hash (c1, c3, c2)
这意味着最终的哈希值不依赖于输入序列的顺序。它只取决于所有输入的内容。
或者,是否有一些功能可以实现着色混淆计算?
green + red + yellow = yellow + green + red
这意味着最终颜色不依赖于着色的顺序,它只取决于颜色成分。
答案 0 :(得分:0)
接收器要么有颜色要么没有颜色所以你可以认为每种颜色都是一个比特,只要你在整个比特顺序中为每种颜色分配一个特定的索引,你应该能够给每个接收器一个可以直接比较的哈希值。例如,将红色设置为位位置0,将黄色设置为位位置1,将绿色设置为位位置2,依此类推。完成后,您可以使用XOR按位运算符比较任意两个接收器。作为参考,如果A和B相同,A XOR B
将返回0。
例如,您可以使用枚举执行以下操作:
enum Colors {
Red = 0,
Yellow = 1,
Green = 2,
Blue = 3
}
然后你只需拿走接收器的所有颜色:
hash = hash | (1 << color)
最后你可以做到:
receiver_a ^ receiver_b
其中^
是XOR操作。
在这种情况下,颜色(红色,蓝色,绿色)或(绿色,红色,蓝色)或(红色,绿色,蓝色)的接收器都将对应于二进制的散列值13或1101。贯穿数学:
hash = 0
hash = hash | (1 << 0) # Red = 0
print hash # 1b
hash = hash | (1 << 2) # Green = 2
print hash # 101b
hash = hash | (1 << 3) # Blue = 3
print hash # 1101b
正如您所看到的,收据的顺序并不重要;每种颜色在整个散列值中获得特定的确定性位置。因此,每种颜色组合都是独特的,可以再现。
基本上,这是您数据的SAT表示。