【问题标题】:How to count the number of all the possible binary sub strings of a given length?如何计算给定长度的所有可能的二进制子字符串的数量?
【发布时间】: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


    【解决方案1】:

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

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

    主数组

    BBBBBB

    子数组

    AAABBB

    BAAABB

    BBAAAB

    BBBAAA

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      最近更新 更多