Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串距离,仅限换位_String_Algorithm_Dynamic Programming_Levenshtein Distance_Edit Distance - Fatal编程技术网

String 字符串距离,仅限换位

String 字符串距离,仅限换位,string,algorithm,dynamic-programming,levenshtein-distance,edit-distance,String,Algorithm,Dynamic Programming,Levenshtein Distance,Edit Distance,可能重复: 我正在寻找一种算法,可以计算某种字符串距离,其中唯一允许的操作是两个相邻字符的换位。例如: 第1行:“母亲” string2:“moterh” 距离:2(首先将“h”与“e”交换,得到“motehr”,然后将“h”与“r”交换,得到“moterh”) 我知道Damerau–Levenshtein距离与这个问题非常相似,但它需要大量内存(我希望它能在多达1000个字符的单词上快速工作)。我已经写过: int amo = 0; for (int i = 0; i < n; i+

可能重复:

我正在寻找一种算法,可以计算某种字符串距离,其中唯一允许的操作是两个相邻字符的换位。例如:
第1行:“母亲”
string2:“moterh”
距离:2(首先将“h”与“e”交换,得到“motehr”,然后将“h”与“r”交换,得到“moterh”)
我知道Damerau–Levenshtein距离与这个问题非常相似,但它需要大量内存(我希望它能在多达1000个字符的单词上快速工作)。我已经写过:

int amo = 0;

for (int i = 0; i < n; i++)
{
    if (fromString[i] == toString[i])
        continue;
    char toWhat = toString[i];
    int where = -1;
    for (int j = i; j < n; j++)
    {
        if (fromString[j] == toWhat)
        {
            where = j;
            break;
        }
    }
    while (where != i)
    {
        char temp = fromString[where];
        fromString[where] = fromString[where - 1];
        fromString[where - 1] = temp;
        where--;
        amo++;
    }
}
cout << amo << endl;`
intamo=0;
对于(int i=0;icout基本上,您要求的是算法,但只允许转置(又称交换、旋转)操作。在《算法导论》一书中,您将找到实现旋转操作的线索,这是动态规划一章末尾的问题之一。此外,在《算法设计手册》一书中,在动态规划一章中,有一个完整的C-sans换位操作中的编辑距离算法的实现(同样,这是本章末尾提出的练习之一)

在上面的链接中,您会发现实现编辑距离算法的典型方法是使用动态规划,这需要O(mn)时间和O(mn)空间。据我所知,没有办法更快地完成这项工作(例如,在不到O(mn)的时间内),但您肯定可以在更少的空间内完成这项工作——聪明的话,您可以将空间减少到O(m),因为计算换位操作的成本只需要表中的当前行和前两行


也就是说,假设您只需要编辑距离。如果您需要实际的编辑操作,那么如果使用动态规划,您将无法使用O(mn)空间来重建解决方案。但是,您可以使用。

不久前询问并回答:如果不要求读者购买或拥有几本计算机科学教科书,这将是一个更好的答案!库确实存在…这是编辑距离的一种限制情况,实际上更简单。您不需要完整的O(mn)算法,实际上它可以在O(n log n)中完成,使用合并排序,请参见复制关闭框中的链接答案。这是肯德尔头的距离。