在下面的代码中,我试图计算二进制数字数组中所有可能的长度为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',这将产生OutOfMemoryError对于大数值m(比如m = 30)。
我的问题:
1.Is有没有更好的办法来避免这样的错误,因为m的值可能是非常大的,内存分配可能不会被允许?
2.How可以予精确测试,如果存储器分配到该阵列实际分配之前是可能的, 我已经使用
if (Runtime.getRuntime().freeMemory() < ((Integer.SIZE/8)* Math.pow(2, m))) throw new Exception("value of m too large");
检查可用存储器已经尝试过,但它抛出异常时米在21和25之间,作为实际分配发生(不使用上述测试条件)m < 25.
我的方法是否正确?
在'Java'这是一个[HashMap中](http://docs.oracle.com/javase/7/docs/api/java /util/HashMap.html) – OldCurmudgeon