【问题标题】:Compare a list of strings with each other optimally以最佳方式相互比较字符串列表
【发布时间】:2014-08-13 23:20:27
【问题描述】:

我想使用 Damerau 到 Levenshtein 距离来比较字符串列表

目前我有:

char lastchar = (char)('z'+1);

        SimilarStrings similarStrings = new SimilarStrings();

        List<String> listString = new List<string>();

        listString.Add("Rammstein");
        listString.Add("Ramstein");
        listString.Add("Rammsten");

        listString.Add("Metallica");
        listString.Add("Metalica");
        listString.Add("Metaica");

        for (int i = 0; i < listString.Count(); i++)
        {
            for(int n = 0; n < listString.Count(); n++)
            {
                String str1 = String.Copy(listString[i]);
                String str2 = String.Copy(listString[n]);
                Console.Write(str1); Console.Write(" to "); Console.Write(str2 + "\n");
                int DADistance = SimilarStrings.damerauLevenshteinDistance(str1, str2, (int)lastchar);
                Console.WriteLine(DADistance);
            }
        }

这基本上可以正常工作,唯一的问题是每次比较都进行了两次。这意味着例如将“Rammstein”与“Metallica”进行比较,然后将“Metallica”再次与“Rammstein”进行比较。一半的比较就足够了。但是我该如何以一种好的方式做到这一点呢?我只能想一些复杂的方法。

【问题讨论】:

标签: c# .net


【解决方案1】:

标准方法是从外循环索引加一开始内循环。

for (int i = 0; i < listString.Count(); i++)
    for (int n = i + 1; n < listString.Count(); n++)

假设您不想将每个字符串与其自身进行比较 - 如果您这样做,请删除 + 1

这是一个逻辑示例。如果您的列表是:a b c d,您可能希望将a 与:

a <> b
a <> c
a <> d

对于b,您无需将ba 进行比较,因为您已经将a 与所有内容进行了比较。所以可以从c开始:

b <> c
b <> d

对于c,您已经将ab 与所有内容进行了比较,因此您可以从d 开始:

c <> d

所以每个元素只需要与列表中之后的元素进行比较——这就是上面嵌套循环所表达的。

【讨论】:

    【解决方案2】:

    这应该可以防止重复比较

        for (int i = 0; i < listString.Count(); i++)
        {
            for(int n = i + 1; n < listString.Count(); n++)
            {
                ...
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-10
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多