【问题标题】:Hamming distance between two strings of equal length两个等长字符串之间的汉明距离
【发布时间】:2017-05-18 07:47:45
【问题描述】:

我需要在两个相等长度的字符串之间应用汉明距离。我使用下面的代码

private int HD(String d1, String d2){

    return (d1.equals(d2)) ? 0 : 1;
} 

那么代码写对了吗?

【问题讨论】:

标签: java


【解决方案1】:

汉明距离计算两个字符串之间的距离,但它们的长度必须相等。

它测量两个字符串相等的最小替换次数。

    private int HammingDistance(String One, String Two)
    {
       if (One.length() != Two.length())
        return -1;

       int counter = 0;

       for (int i = 0; i < One.length(); i++)
       {
           if (One.charAt(i) != Two.charAt(i)) counter++;
       }

       return counter;
    }

您所做的只是比较两个字符串的长度,这是不需要的。

【讨论】:

  • 谢谢@Jack jay。是的,现在它是正确的,因为我错过了计数器步骤,这意味着计算 1 的数量。但是归一化的汉明距离呢?是通过将计数器除以这样的位数'return counter/one.length()'
  • 只是 return counter; 计数器本身有一个字符串中要替换的字符总数。
  • 但计数器将仅包含未标准化的 1 的总数。我需要在 (0,1) 之间对 HD 的每个值进行归一化。
  • counter 将包含两个字符串之间的汉明距离,得到之后你可以做任何你想做的事情。我不明白你在说什么正常化。
【解决方案2】:

两个相等长度的字符串之间的汉明距离是对应符号不同的位置数。换句话说,它是将一个字符串更改为另一个字符串所需的最少替换次数。例如,“cat”和“mat”之间的汉明距离为 1。

您的代码似乎只是检查两个字符串的长度是否相等。以下汉明距离的代码源可能会对您有所帮助。

https://commons.apache.org/sandbox/commons-text/jacoco/org.apache.commons.text.similarity/HammingDistance.java.html

【讨论】:

    【解决方案3】:

    您的代码只是检查 2 个字符串是否相等,如果相等则返回 0,否则返回 1。 它没有说汉明距离。

    什么是汉明距离?

    汉明距离只不过是比较字符串的同一索引处字母表中的差异数量,因此告诉您必须使 2 个字符串相等的替换次数。

    例子:

    假设我有 2 个长度相等的字符串“ABCD”和“ACCC”。在此示例中,两个字符串中的第一个和倒数第二个相同,因此您需要在 2nd 中替换 2 个字符以使其相同,因此在这种情况下,汉明距离为 2。

    A B C D

    A C C C

    .......

    0 1 0 1

    所以总汉明距离为 1 + 1 = 2。

    汉明距离程序:

    private  int getHD(String d1, String d2) {
    int distance = 0;
    if (d1 == null || d2 == null) {
      System.out.println("Either String is null");
      System.exit(0); // or throw a RuntimeException here
    }
    
    d1 = d1.toUpperCase();
    d2 = d2.toUpperCase();
    
    if (d1.length() != d2.length()) {
      System.out.println("The string are not equal in length.");
      System.exit(0); //or throw a RuntimeException here
    }
    
    for (int i = 0; i < d1.length(); i++) {
      if (d1.charAt(i) != d2.charAt(i))
        distance++;
    }
    
    return distance;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多