针对最大字符串输入长度优化内存使用情况的任何好技术



我正在设计一个字符串算法,问题在于输入的大小。根据定义,Java 的最大字符串长度是 2147483647,以避免混淆 ~2.15x10^9。

根据定义,Manacher的算法需要一个字符数组:

char[n*2 +3]其中 n 是输入的长度(大小为 n 的字符串)

根据定义,最大整数是上面提到的 ~2.15x10^9,因此字符数组可以是最大大小

char [ ~2.15x10^9 ];

java中manachers算法的这种计算将输入字符串的限制降低到n = (~2.15x10^9 - 3)/2。准确地说,这正是1073741822。~1.1x10^9.

最大长度的 char 数组具有 (n*2) + 32 字节 = ( ~2.1x10^9 * 2 ) + 32 字节 = ~4.2x10^9 字节 (4.2GB)

还有各种大小、集合和其他集合的其他数组。我相信这将使程序占用~~30GB的整个空间。 用于计算算法的最大RAM内存输入,我们确定该算法最多为~1.1x10^9个字符长。

你能建议我一些技术来保持"最长的字符串输入"和"内存管理"之间的平衡吗?谢谢

根据这篇文章,Manacher 算法在线性时间内找到最长的回文子串(n是原始字符串的长度)。

这是 Java 中的一个实现,它表明该算法在内存消耗方面也非常出色(你需要两个数组,一个是 chars,另一个是 int,它们的长度都是原始字符串的两倍,你还需要存储原始字符串)。

问题是您的原始字符串非常长,因此您正在达到语言限制、内存限制等。

另一方面,您的字母表仅由 7 个字符组成:原始字符串字符A C T G,加上字母分隔符(例如#)和字符串字符的开头和结尾(例如$@)。这意味着您只需要3 位来存储每个可能的字符。因此,如果您愿意使用按位运算符位掩码,则可以long中存储 21 个字符(这是因为long用 64 位表示)。此方法的编码会更复杂,但会使用更少的内存。

另一种可能的解决方案是使用动态结构而不是字符串和数组。这些结构会使用大量内存,但它不会是连续内存,这意味着您不会达到最大数组大小限制和整数等的语言限制。这种方法使用后缀树,根据本文,这是一种线性时间方法。在那篇文章中,C++有一个解决方案。祝你好运!

最新更新