我需要根据列表中的字符串和目标字符串之间的差异对List进行排序。
实现这种排序算法的最佳方法是什么?
我对性能并不太在意,但收藏可能会变得很大(让我们说50万个上衣)。
感谢任何帮助!
答案 0 :(得分:10)
我建议计算Levenshtein distance,然后按整数结果排序。 (Magic code)
public void Example()
{
string target = "target";
List<string> myStings = new List<string>();
myStings.Add("this");
myStings.Add("that");
myStrings = myStrings.OrderBy(each => Levenshtein(each, target)).ToList();
}
public int Levenshtein(string stringA, string stringB)
{
// Magic goes here
return 0;
}
没有OrderBy的老skool 2.0家伙?
List<string> myStrings;
myStrings.Sort(LevenshteinCompare);
...
public class LevenshteinCompare: IComparer<string>
{
public int Compare(string x, string y)
{
// Magic goes here
}
}
答案 1 :(得分:1)
实现这种排序算法的最佳方法是什么?
说谎,我建议使用quicksort的库实现,与目标字符串的距离作为排序键。
这当然不是一个有用的答案。为什么不?因为你真正想知道的是“字符串有什么好的差异指标?”
真正的问题的答案,遗憾的是,“它取决于”;这取决于你关心的距离属性。
话虽如此,请阅读Levenstein距离及其对弦乐的真实说法。
您可以通过调整动态编程矩阵中不同步骤的权重来修改基本算法,以使度量偏向于长期运行中出现的相同字符。
您还可以使用Soundex算法,该算法说明哪些字符串听起来相似(但最适合短字符串;我不知道您使用的是哪种输入)。
如果字符串长度相等,您还可以使用汉明距离(计算字符串不同的索引数)。通过计算(单方面)不存在的索引总是不同的,可以推广到某些东西,这给你一些类似Levenstein的东西(有点'sorta'可能)。
简短版本:取决于。我已经给出了一些意见,但是如果没有你的更多信息,我不能说哪个对你来说是个好的决定。