[英]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.