Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
C 具有路径重构渐近复杂性的levenshtein距离实现_C_Complexity Theory_Asymptotic Complexity - Fatal编程技术网

C 具有路径重构渐近复杂性的levenshtein距离实现

C 具有路径重构渐近复杂性的levenshtein距离实现,c,complexity-theory,asymptotic-complexity,C,Complexity Theory,Asymptotic Complexity,有人能帮我定义这两个C函数的渐近复杂性吗 1) 输出两个给定字符串的levenshtein距离的简单函数 int levenshtein_distance( char *s1 , char *s2 ,matrix_t matrix ) { int options[3]; int len_s1 = strlen(s1); int len_s2 = strlen(s2); int res; int i; int j; int k;

有人能帮我定义这两个C函数的渐近复杂性吗

1) 输出两个给定字符串的levenshtein距离的简单函数

int levenshtein_distance( char *s1 , char *s2 ,matrix_t  matrix )
{
    int options[3];
    int len_s1 = strlen(s1);
    int len_s2 = strlen(s2);
    int res;
    int i;
    int j;
    int k;

    for(i = 1 ; i < len_s1 ; i++ )
    {
        for(j = 1 ; j < len_s2 ; j++)
        {
            options[MATCH]  = matrix[i-1][j-1].cost + match(s1[i],s2[j]);
            options[INSERT] = matrix[i][j-1].cost + 1;
            options[DELETE] = matrix[i-1][j].cost + 1;

            matrix[i][j].cost = options[MATCH];
            matrix[i][j].parent = MATCH;

            for (k=INSERT; k<=DELETE; k++)
                if (options[k] < matrix[i][j].cost)
                {
                    matrix[i][j].cost = options[k];
                    matrix[i][j].parent = k;
                }
        }

    }

    res = matrix[(len_s1-1)][(len_s2 -1)].cost;
    return res;
}
比赛是

int match(char a , char b)
{
    if(a == b) return 0;
    else return 1;
}

match out、insert out和delete out仅对每个调用执行printf

第一个函数显然是O(m*n),其中m=strlen(s1)和n=strlen(s2)。带有if条件的最内层循环执行3*m*n次,因此为O(m*n)

第二个函数是O(i+j)(根据提供的定义,不清楚i、j和strlen(s1)和strlen(s2)之间存在什么关系)。请注意,在每次递归调用中,我们可能会匹配所提供的条件之一,并且i或j或两者都会递减。当i或j低于0时,这会导致错误,或者在此之前终止。还要注意,对于特定的递归调用,它只执行其中一个路径。在最坏的情况下,i下降到0匹配删除i次,然后j下降到0匹配插入j次,然后终止。

顺序如下:i=strlen(s1),j=strlen(s2)。你能解释O(i+j)背后的原因吗?当然。在最坏的情况下,(忽略矩阵的可能语义,并严格查看可能的代码路径),您可以匹配如下内容:DELETE,DELETE。。。删除i次,然后插入,插入。。。插入j次(插入和删除操作也可以交错)。请注意,每次递减i或j,只能执行i删除操作或j插入操作。所以,i加j插入成为一个上界。
int match(char a , char b)
{
    if(a == b) return 0;
    else return 1;
}