【问题标题】:how to differentiate two very long strings in c++?如何区分 C++ 中的两个非常长的字符串?
【发布时间】:2014-11-29 21:55:06
【问题描述】:

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

编辑2:
正如Bobah所说,标题是小姐领先,所以我更新了questoin的标题。
初始 title was 如何在 c++ 中声明 100000x100000 二维整数?
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 ;

【问题讨论】:

  • 您的机器上有 40 GB 内存吗?因为这就是数组需要多少。
  • 您知道您的阵列将占用 40 或 80 GB 空间吗?你有那么多内存吗?
  • 现在我看到它正在走向XY Problem
  • @user3919801 如果您考虑一下,您实际上并不需要整个数组,因为大多数迭代中的大多数元素都是相同的。基本上,您将需要 2 * 100000 个元素 strings 和一个 vector,它最多可以包含从字符串 a 到字符串 b 的 100000 次转换。
  • @user3919801 您链接的维基百科文章包含一个只需要两个矩阵行的算法。

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


【解决方案1】:

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

但是,看看你要分配多大的块:

 40 000 000 000 bytes

我收回我之前的建议。对于这么大的块,最好的方法是分析问题并找出使用更少内存的方法。

【讨论】:

  • 1TB RAM 在服务器世界中已经成为现实,但同意,差异不需要将所有内容加载到 RAM,除非它需要确定性到最后一点。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您的问题很有趣,但标题具有误导性。

    这就是您在数据模型方面所需要的(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
    

    有两个相对较长(但仍为

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

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

    当匹配小于 100% 并且小于配置的阈值时,然后在不删除任何行/列的情况下增加甜甜圈的两个维度的大小,并执行此操作直到任一匹配超过阈值或达到最大甜甜圈大小。当匹配率从下面达到阈值时,您需要滚动甜甜圈丢弃 x 和 y 缓冲区的头部并同时对齐它们(当距离矩阵告诉 X [i] 在 Y 中不存在时,只有 X 需要移动 1 , 但 X[i+1,i+m] 匹配 Y[j, j+m-1])。

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

    Apache v2 license,如果你决定去的话。

    【讨论】:

    • 这个算法的时间复杂度是多少?
    • k * O(N),k由配置参数定义,主要是“甜甜圈”的最大可能尺寸(越大越慢)
    猜你喜欢
    • 2017-09-07
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2014-07-09
    相关资源
    最近更新 更多