2

我有两个字符串 s1:"abcd"和 s2:"ab"以及两个 int 向量 v1:12,13,14,15和 v2: 12,13。我正在计算两个字符串和两个向量之间的距离。我从网上得到了一个c文件的代码来计算两个字符串之间的距离。我正在修改代码以计算两个向量之间的距离,但是在c++. 代码正在运行,但结果不一样(两次计算的距离应该相同)。问题来自:

double transpositions = 0.0;    
for (i = 0; i < s1_len; i++) {
    if (!s1_matches[i]) continue;
    while (!s2_matches[k]) k++;
    if (s1[i] == s2[k]) transpositions++;
    k++;
}

s1_lenis ( s1_len(s1)s2 相同) 和s1_matchis int *s1_matches = (int*) calloc(s1_len, sizeof(int))。我正在运行c带有正确答案的代码,但是当我将代码c++更改为并将字符串变量更改为向量变量时,我得到的数字transposition是不同的。要将字符串更改为向量,我得到向量 ( v1_len) byv1.size()v1_matchby的大小int *v1_matches = (int*) calloc(v1_len, sizeof(int))。代码完全相同:

double transpositions = 0.0;    
for (i = 0; i < v1_len; i++) {
    if (!v1_matches[i]) continue;
    while (!v2_matches[k]) k++;
    if (v1[i] == v2[k]) transpositions++;
    k++;
}

这里有什么问题?

4

1 回答 1

4

您似乎没有对s2_matchesor进行任何边界检查v2_matches。当s1并且s2不相同时,这将具有未定义的行为:

while (!s2_matches[k]) k++;
if (s1[i] == s2[k]) transpositions++;
k++;

,您永远不会检查是否k超出了s2or的范围s2_matches。与矢量版本相同。

于 2013-07-18T23:08:39.247 回答