Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定一个数字是否属于一个组的算法_Algorithm - Fatal编程技术网

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

Algorithm 确定一个数字是否属于一个组的算法,algorithm,Algorithm,我甚至不确定这是否可能,但我认为无论如何都值得一问 假设我们在一个网络中有100台设备。每个设备都有一个唯一的ID 我想告诉这些设备的一组通过只广播一个数据包(所有设备接收的数据包)来做一些事情。 例如,如果我想告诉设备2,5,75116和530做某事,我必须广播:2-5-75-116-530 但如果我想(例如)让95台设备做点什么,这个包可能会很长!!! 所以我需要一种方法来减少这个包的长度 想了一会儿,我想到了一个主意: 如果我只使用素数作为设备ID呢?然后我可以发送我需要的组的设备ID的乘

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

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

我想告诉这些设备的一组通过只广播一个数据包(所有设备接收的数据包)来做一些事情。 例如,如果我想告诉设备2,5,75116和530做某事,我必须广播:2-5-75-116-530 但如果我想(例如)让95台设备做点什么,这个包可能会很长!!! 所以我需要一种方法来减少这个包的长度

想了一会儿,我想到了一个主意:

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

例如,如果我想让设备2,3,5和7做一些事情,我会广播2*3*5*7=210,然后每个设备将计算“210 mod self ID”,只有ID为2,3,5和7的设备才会得到0,这样他们就知道他们应该做一些事情

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

因此,我只需要一种方法,让设备确定他们是否应该做些什么,或者忽略接收到的数据包。我需要包尽可能短


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

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


但人们可以选择一些混合方案。假设您只有一台设备的任务,那么发送
n
位(所有0位,只有一位除外)会很遗憾。因此,您可以获取一个额外的位
T
,它指示数据包的类型。如果如上所述发送长度为
n
的位字符串,则
T
的值设置为0;如果使用更合适的方案(即更少的位),则设置为1。如果只有一台机器需要执行任务,您可以直接发送机器的标签(长度为
O(logn)
bit)。如果执行任务所需的计算机少于
O(n/logn)
的话,这种方法可以减小数据包的大小。不过,对机器进行评估的成本更高。

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

每个设备需要一位,例如,256个设备需要32字节。诚然,如果你只需要一台机器来做出反应,这是有点浪费,但是如果你需要,比如说,95台设备来做出反应,这是相当紧凑的


您提到您需要设备id,为什么不使用位字符串?每一位代表一个设备,您只需要按位and来判断给定的机器是否应该做出反应。每个设备需要一位,也就是说,256个设备需要16个字节。诚然,如果你只需要一台机器就可以做出反应,那是有点浪费,但是如果你需要,比如说,95台设备来做出反应,那就相当紧凑了。我也想到了这个想法。设备ID应该是0b1-0b10-0b100等等,但这意味着我应该发送一个长度为100/8~=13字节的数据包,这是一个超出我限制的有效负载。顺便说一句,你确定你的计算正确吗?!对于256个设备,我们需要256/8=32字节。限制是多少13个字节几乎不可能在单个数据包的一次广播中完成,除非在给定的时刻你需要点击某些模式的机器;你在数学上是对的。256个设备->32个字节。设备id只能是100(0b01100100=1个字节)。您只需要使用它来计算要使用的数据包的哪个字节(
ceil(100/8)
=第13个)和按位,以及该字节与
100%8
=
4
=
0b00000100
。4字节=32位=足够的空间来存储2^32个设备ID。+1用于混合方案。我想到了这一点,但不知道如何最好地解释它。你的解释很好。