【发布时间】:2017-04-11 17:19:36
【问题描述】:
我正在设计一个字符串算法,问题在于输入的大小。根据定义,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 bytes = ( ~2.1x10^9 * 2 ) + 32 bytes = ~4.2x10^9 bytes (4.2GBs)
还有各种大小、集合和其他集合的附加数组。我相信这将使程序占用〜30GBs的整个空间。用于计算算法的最大 RAM 内存输入,我们确定该算法的长度最多为 ~1.1x10^9 个字符。
您能否建议我一些技巧,以使内容保持在“最长可能的字符串输入”和“内存管理”之间?谢谢
【问题讨论】:
-
您确定您的算法需要一个 16 位 UTF-16 字符数组,而不是 字节 数组吗?
-
您是否真的有要在其上运行此算法的 4 GB 输入?听起来您刚刚接受了 Java 数组的绝对限制,并假设您的程序将在这些限制下运行。
-
老实说,这不会为您节省超过 2 倍。老实说?处理限制;它们并不是特别糟糕。
-
@s_arabov:如果甚至存在内存问题,我会通过分析和查看我的程序最重的内存使用量实际来自哪里来接近它。如果存在内存问题,解决方案可能涉及在磁盘上保留更多数据,或者可能只是购买更多 RAM。
-
@GhostCat 该算法旨在寻找 DNA 和 RNA 字符串之间的关系