6

在这个任务中,我需要获得两个字符串序列 1 和序列 2 之间的汉明距离(两个相等长度的字符串之间的汉明距离是对应符号不同的位置数 - 来自维基百科)。

首先,我制作了 2 个新字符串,这是 2 个原始字符串,但都使用小写,以便比较容易。然后我求助于使用 for 循环和 if 来比较两个字符串。对于这 2 对字符串中字符的任何差异,循环会将 1 添加到 int x = 0。方法的返回将是此 x 的值。

public static int getHammingDistance(String sequence1, String sequence2) {
    int a = 0;
    String sequenceX = sequence1.toLowerCase();
    String sequenceY = sequence2.toLowerCase();
    for (int x = 0; x < sequenceX.length(); x++) {
        for (int y = 0; y < sequenceY.length(); y++) {
            if (sequenceX.charAt(x) == sequenceY.charAt(y)) {
                a += 0;
            } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) {
                a += 1;
            }
        }
    }
    return a;
}

那么代码看起来足够好并且功能足够吗?我可以修复或优化代码吗?提前致谢。我是个大菜鸟,如果我问了什么愚蠢的问题,请原谅我

4

4 回答 4

5

从我的观点来看,以下实现是可以的:

public static int getHammingDistance(String sequence1, String sequence2) {
    char[] s1 = sequence1.toCharArray();
    char[] s2 = sequence2.toCharArray();

    int shorter = Math.min(s1.length, s2.length);
    int longest = Math.max(s1.length, s2.length);

    int result = 0;
    for (int i=0; i<shorter; i++) {
        if (s1[i] != s2[i]) result++;
    }

    result += longest - shorter;

    return result;
}
  1. 使用数组,避免为每个需要比较的单个字符调用两个方法(charAt);
  2. 当一个字符串比另一个字符串长时避免异常。
于 2013-04-28T08:16:03.960 回答
3

您的代码完全关闭。正如你自己所说,距离是字符串不同的地方的数量 - 所以你应该只有 1 个循环,一次遍历两个字符串。相反,您有 2 个嵌套循环,它们将字符串 a 中的每个索引与字符串 b 中的每个索引进行比较。

此外,编写导致结果的 if 条件a+=0是浪费时间。

试试这个:

for (int x = 0; x < sequenceX.length(); x++) { //both are of the same length
    if (sequenceX.charAt(x) != sequenceY.charAt(x)) {
        a += 1;
    }
}

此外,这仍然是一种幼稚的方法,可能不适用于复杂的 unicode 字符(其中 2 个字符在逻辑上可以相等但字符代码不同)

于 2013-04-28T08:05:56.960 回答
1
public static int getHammingDistance(String sequenceX, String sequenceY) {
    int a = 0;
   // String sequenceX = sequence1.toLowerCase();
    //String sequenceY = sequence2.toLowerCase();
    if (sequenceX.length() != sequenceY.length()) {
        return -1; //input strings should be of equal length
    }

    for (int i = 0; i < sequenceX.length(); i++) {
        if (sequenceX.charAt(i) != sequenceY.charAt(i)) {
            a++;
        }
    }
    return a;
}
于 2013-04-28T08:46:05.150 回答
0

您的代码没问题,但是我建议您进行以下改进。

  1. 不要使用charAt()字符串。使用 before 循环从字符串中获取 char 数组toCharArray(),然后使用该数组。这更具可读性和更有效。
  2. 结构

        if (sequenceX.charAt(x) == sequenceY.charAt(y)) {
            a += 0;
        } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) {
            a += 1;
        }
    

    看起来多余。将其修复为: if (sequenceX.charAt(x) == sequenceY.charAt(y)) { a += 0; } 其他 { 一个 += 1; }

此外,考虑到我建议您使用数组将其更改为:

a += seqx[x] == seqY[x] ? 0 : 1

更少的代码更少的错误...

编辑:正如@radai 所提到的,您根本不需要if/else结构:添加0a是多余的。

于 2013-04-28T08:08:43.847 回答