以最佳方式比较字符串列表

本文关键字:字符串 列表 比较 方式 最佳 | 更新日期: 2023-09-27 18:17:50

我想用Damerau to Levenshtein Distance比较一个字符串列表

目前我有:

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);
            }
        }

这基本上工作得很好,唯一的问题是每次比较都要进行两次。意思是:"拉姆施泰因"被比作"金属乐队",然后"金属乐队"又被比作"拉姆施泰因"。一半的比较就足够了。但我怎样才能做得好呢?我只能想出一些复杂的办法。

以最佳方式比较字符串列表

标准的方法是从外循环索引加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

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

这样可以防止重复比较

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