[英]Best way of sorting a list of strings based on difference from a target string?
我需要根据列表中的字符串与目标字符串之间的差异对列表进行排序。
实现这种排序算法的最佳方法是什么?
我不太在意性能,但是收藏可能会很大(比如说有100万顶)。
任何帮助表示赞赏!
我建议计算Levenshtein距离 ,然后简单地按整数结果排序。 ( 魔术码 )
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
}
}
实现这种排序算法的最佳方法是什么?
作为开玩笑的人,我建议使用quicksort的库实现,并以到目标字符串的距离作为排序键。
这当然不是一个有用的答案。 为什么不? 因为您真正想知道的是“什么是字符串的良好差异度量?”
遗憾的是,对真正的疑问的答案是“取决于”。 这取决于您关心的距离的哪些属性。
话虽如此,请阅读Levenstein距离及其对琴弦的真实描述。
您可以修改基本算法,以使度量标准偏向于长期运行中出现的相同字符,方法是摆弄动态编程矩阵中不同步骤的权重。
您还可以使用Soundex算法,该算法说明哪些字符串听起来相似(但最适合短字符串;我不知道您使用哪种输入)。
如果字符串长度相等,则也可以使用汉明距离(计算字符串不同处的索引数)。 通过将(单方面)不存在的索引计算为总是不同,可以将其概括为某种事物 ,这会给您一些类似于Levenstein的事物(也许有点“排序”)。
简短的版本:取决于。 我已经提供了一些建议,但是如果您不提供更多信息,那么我不能说这对您来说是个不错的决定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.