【发布时间】:2025-11-27 01:50:02
【问题描述】:
在下面的代码中,我试图在一个二进制数数组中计算所有可能的长度为 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
我的方法正确吗?
【问题讨论】:
标签: java arrays performance memory out-of-memory