如何在c ++中区分两个非常长的字符串?

时间:2014-10-05 12:45:24

标签: string algorithm memory-management string-matching information-theory

我想解决 Levenshtein_distance这个问题,字符串的长度太大了。

编辑2:
由于Bobah说标题是错过领先的,所以我更新了questoin的标题 初始title was如何在c ++中声明100000x100000 2-d整数?
Content was
有任何方法可以在c ++中声明int x [100000] [100000] 当我在全局声明它时,编译器会生成error: size of array ‘x’ is too large 一种方法可能是使用map< pair< int , int > , int > mymap
但是分配和解除分配需要更多时间。
还有其他任何方式,如uisng vector<int> myvec;

3 个答案:

答案 0 :(得分:3)

对于大的内存块,最好的方法是使用操作系统的工具进行动态分配,以便为进程添加虚拟内存。

但是,请查看您尝试分配的块大小:

 40 000 000 000 bytes

我接受了我之前的建议。对于一个大的块,最好的方法是分析问题并找出一种使用更少内存的方法。

答案 1 :(得分:2)

可以一次每行完成填充编辑距离矩阵。记住前一行足以计算当前行。这种观察将空间使用从二次减少到线性。有意义吗?

答案 2 :(得分:0)

你的问题非常有趣,但标题有误导性。

这就是你需要的数据模型(x - 第一个字符串,y - 第二个字符串,* - 距离矩阵)。

      y <-- first string (scrolls from top down)

      y
  x  x  x  x  x  x  x  x  <- second string (scrolls from left to right)
      y *  *  *

      y *  *  *

      y *  *  * <-- distance matrix (a donut) scrolls together with strings
                    and grows/shrinks when needed, as explained below
      y

有两个相对较长(但仍然是&lt;&lt; N)字符缓冲区和相对较小(&lt;&lt;缓冲区大小)矩形(从正方形开始)距离矩阵。

使矩阵成为donut - 二维环形缓冲区(可以使用boost中的那个,或者只使用std :: deque)。

当矩阵当前覆盖的字符串片段为100%匹配时,将两个缓冲区移动一个,围绕两个轴旋转圆环,重新计算距离矩阵中的一个新行/列。

当匹配为&lt; 100%且小于配置的阈值时,请增加圆环的两个尺寸的大小,而不删除任何行/列,直到任一匹配超过阈值或达到最大圆环尺寸为止。当匹配率从下面达到阈值时,你需要滚动圆环丢弃x和y缓冲区的头部并同时对齐它们(当距离矩阵告诉Y中不存在X [i]时,只需X移动1 ,但X [i + 1,i + m]与Y [j,j + m-1]匹配。

因此,您将拥有一个简单但非常有效的启发式差异引擎,具有确定的有限内存占用,并且所有内存都可以在启动时预先分配,因此动态分配不会在运行时降低速度。

Apache v2 license,以防你决定参加。