一种确定数字是否属于某个组的算法

时间:2015-11-20 00:02:25

标签: algorithm

我甚至不确定这是否可行,但我认为无论如何都值得问。

假设我们网络中有100台设备。每个设备都有一个唯一的ID。

我想告诉一组这些设备通过只播放一个数据包(所有设备都收到的数据包)来做某事。 例如,如果我想告诉设备2,5,75,116和530做某事,我必须广播这个:2-5-75-116-530 但是如果我想要(例如)95个设备做某事,这个数据包可以变得很长! 所以我需要一种方法来减少这个数据包的长度。

经过一段时间的思考,我想出了一个主意:

如果我只使用素数作为设备ID怎么办?然后我可以发送我需要的组的设备ID的产品作为数据包,每个设备将检查接收到的号码的剩余部分及其设备ID是否为0.

例如,如果我想要设备2,3,5和7做某事,我会广播2 * 3 * 5 * 7 = 210然后每个设备将计算" 210 mod自我ID"并且只有ID为2,3,5和7的设备才会得到0,因此他们知道应该做什么。

但是这种方法效率不高,因为第100个素数是541,而广播的数字可能会变得非常大而且" mod"计算可能会非常困难。(这些设备有8位处理器)。

所以我只需要一种方法让设备确定它们是应该做什么还是忽略收到的数据包。我需要数据包尽可能短。

我尽力解释这个问题,如果它仍然含糊不清,请告诉我解释更多。

2 个答案:

答案 0 :(得分:6)

就像Ed Cottrell建议的那样,有点字符串可以完成这项工作。如果机器标记为{1,..,n},则有2个 n -1个可能的子集(假设您没有发送没有预期目标的请求)。所以你需要一个能够保存这种子集的每个可能签名的数据结构,无论你决定签名是什么。并且n位(每台机器一位)是关于这种数据结构的大小最好的。在机器上执行的评估需要恒定的时间(在带有标签l的机器上只需查看l位。

但是人们可以采用一些混合方案。假设您只有一个设备的任务,那么发送n位(全部为0,除了一个)将是一个遗憾。因此,您可以使用一个额外的位T来指示数据包的类型。如果要发送如上所述的长度为T的位串,则将n的值设置为0;如果使用更合适的方案(即更少的位),则将其设置为1。对于只需要执行任务的一台机器,您可以直接发送机器的标签(长度为O(log n)位)。如果您执行任务所需的机器少于O(n/log n),则此方法会减小数据包的大小。然而,对机器的评估更加昂贵。

答案 1 :(得分:6)

您可以使用位字符串,其中每个位代表一个设备。然后,您只需要按位AND来判断给定的机器是否应该做出反应。

每个设备需要一位,例如,256个设备需要32个字节。不可否认,如果您只需要一台机器来做出反应,那就有点浪费了,但如果您需要95台设备作出响应,它会非常紧凑。

您提到您需要设备ID为< = 4个字节,但这没有问题:4个字节= 32位=足够的空间来存储2 ^ 32个设备ID。例如,第101台机器的设备ID(如果从0开始)可能只是1000b01100100)= 1字节。您只需要使用它来确定要使用的数据包的哪个字节(ceil(100 / 8) =第13个)以及该字节与100 % 8 = 4 = 0b00000100的按位AND 。

作为cobarzan said,您还可以使用允许单独寻址的混合方案。在这种情况下,您可以使用第一位作为信号来指示多机或单机寻址。正如cobarzan所说,这需要更多的处理,这意味着第一个字节只能存储7个机器信号,而不是8个。