繁体   English   中英

如何计算给定长度的所有可能的二进制子字符串的数量?

[英]How to count the number of all the possible binary sub strings of a given length?

在下面的代码中,我试图对二进制数数组中所有长度为m的二进制子字符串进行计数,这意味着在给定的二进制数组中可以找到2 ^ m个可能的子字符串。

我尝试使用以下方法来完成任务:

byte [] E = {0,1,0,0,1,1,0,1,0,1,0,1}; 
int m=3;
int [] c = new int [(int)Math.pow(2,m)];

for(int i=0;i<n;i++)
{
int g=0;
for(int j=0;j<m;j++)
{
g <<= 1;
if(E[i+j]==1)
g++;
}
c[g]++;  
}
for(int i=0;i<c.length;i++)
System.out.print("n("+i+")->"+c[i]+"     ");

输出:

n(0)->0     n(1)->1     n(2)->3     n(3)->1     n(4)->1     n(5)->3     n(6)->1     n(7)->0

上面的方法要求将2 ^ m的内存分配给数组'c',这将为较大的m值(例如m = 30)生成OutOfMemoryError

我的问题:

1.是否有更好的方法来避免这种错误,因为m的值可能非常大并且可能不允许使用内存分配?

2.如何准确测试,如果在实际分配之前可以对数组进行内存分配,我已经尝试使用

if (Runtime.getRuntime().freeMemory() < ((Integer.SIZE/8)* Math.pow(2, m))) throw new Exception("value of m too large");

来检查可用内存,但是当m在21到25之间时会抛出异常,因为m <25会发生实际分配(不使用上述测试条件)。

我的方法正确吗?

您可以使用字典而不是数组,并延迟分配条目。 尽管每个条目的开销要大得多,但您的条目将远远少于2 m,尤其是当m变大时,因为在长度为n的字符串中只有n-m+1个子字符串,长度为m 因此,您可能会有n-m+1个条目(即使中等m条目也比2 m更好),但是只有E具有特殊结构时,通常该条目会更少。

听起来您是在问与发布的数学不同的问题

如果尝试从大小为6(B)的数组中获取大小为3(A)的连续部分,则可能有4个子字符串(B-A +1)

主阵列

BBBBBB

子阵列

AAABBB

BAAABB

BBAAAB

BBBAAA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM