【发布时间】:2018-11-08 19:04:10
【问题描述】:
问题表述:给定一个长度为 l 的二进制代码,对于每 t 位集合 (l%t=0),如果至少存在一位值为 1 的位,我们将结果加 1。
我的问题:如何有效地得到最终结果?
例如,我们有一个二进制代码010 110 000,并且 t=3。那么最终结果是 2。因为对于000,没有值 1 的位。对于 110,至少存在一位值 1。我们将结果加 1。对于 010,也存在一位值 1。我们将结果加 1。因此,最终结果为 2。
我的问题是如何有效地解决这个问题而不扫描每 t 位,这会导致时间复杂度与二进制代码的长度成线性关系。
对于计数集问题(计算二进制代码中有多少个 1),有一些算法需要恒定时间来解决它,方法是采用有限数量的掩码和移位操作,例如 MIT HAKMEM Count 算法。
但是,传统计数集问题的现有算法无法用于解决我的问题。
有人知道解决我问题的一些技巧吗?如果它使问题更容易解决,您可以假设输入二进制代码的最大长度。
【问题讨论】:
-
输入的形式是什么?一个字符串?字节数组?
-
输入的形式并不重要。输入只是一个随机的二进制代码。
-
形式非常重要。
String的解决方案与byte[]或int或long或BigInteger值的解决方案没有任何共同之处。 -
那么对于这个问题,你可以假设输入是一个64位整数的二进制代码。