Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Design patterns 二进制位模式组合计数_Design Patterns_Binary_Combinations - Fatal编程技术网

Design patterns 二进制位模式组合计数

Design patterns 二进制位模式组合计数,design-patterns,binary,combinations,Design Patterns,Binary,Combinations,我正在寻找一种算法,该算法将计算n位字中等于或小于小于小于2^n的任意限制的二进制位模式数。此外,我想为所有1位组合、2位组合等生成计数。显然,如果限制为2^n,则会有2^n组合(C(n,1)1位组合加上C(n,2)2位加上C(n,3)3位等等)。但是,如果施加了限制,并非所有这些可能的组合都是有效的(低于施加的限制) 例如,说n=4。有16种可能的位模式,其中15种包含1个或多个1位。如果限制为10,则大于10的模式将不包括在计数中。因此,对于单位模式,有效的模式将是0001、0010、010

我正在寻找一种算法,该算法将计算
n位
字中等于或小于小于小于
2^n
的任意限制的二进制位模式数。此外,我想为所有
1位
组合、
2位
组合等生成计数。显然,如果限制为
2^n
,则会有
2^n
组合
(C(n,1)1位组合加上C(n,2)2位加上C(n,3)3位等等)
。但是,如果施加了限制,并非所有这些可能的组合都是有效的(低于施加的限制)

例如,说
n=4
。有16种可能的位模式,其中15种包含1个或多个
1位
。如果限制为10,则大于10的模式将不包括在计数中。因此,对于单位模式,有效的模式将是
0001
0010
0100
1000
。两位模式将是
0011
0101
0110
1001
。模式
1010
1100
将不被计算,因为它们超过10。唯一的3位将是
0111
,而唯一的4位模式
1111
超出了限制

如果
F
是我的计数函数,
F(4,10,1)
将返回4,即小于10的1位
4位
模式数
F(4,10,2)
将返回4,其中as
C(4,2)
是6。因为
n
的实际值可能很大(40或40位),所以枚举可能的模式、针对限制进行测试以及计算有效模式是不切实际的


关于如何有效地完成这项工作,你有什么想法吗?

既然这是一个家庭作业问题,你为什么不提出你的想法,我们可以给你一些建议。你总是可以设计一个低效的算法,并对其进行分析,以尝试创造效率…

将低于限制的范围分解为大小为2^m的区域,使用固定前缀,并考虑前缀中设置的位。

只是一个提示,但尝试以归纳/递归的方式(无论你喜欢哪个名字)攻击它;将问题简化为更小的实例。

好主意;OP也很好地表达了他的问题,因此我期待他提出一些好的建议!