我想解决 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
;
答案 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,以防你决定参加。