我试图按另一个数组中定义的顺序对字符串列表进行排序。我知道可以通过多种方式来实现,但是我不确定如何有效地做到这一点。我需要它能够处理大量的未排序列表,其中包含数千个项目。这是我想出的:
List<string> sortStringListByArray(List<string> unsortedList, string[] order)
{
List<string> sortedList = new List<string>();
for(int i = 0; i < order.Length; i++)
{
foreach(string s in unsortedList)
{
if(s.Equals(order[i]))
{
sortedList.Add(s);
}
}
}
return sortedList;
}
它可以按预期工作,但绝对无效。我有什么办法可以在不遍历列表和订单的情况下做到这一点?
编辑:澄清
谢谢!
表示它的最简单方法是使用正确的内部联接:
return order.Join(unsortedList, a => a, b => b, (a, b) => b).ToList();
最好的时间复杂度是使用Lookup或Dictionary的O(n + m):
var lookup = unsortedList.ToLookup(x => x);
return order.SelectMany(x => lookup[x]).ToList();
通过使用Dictionary<string, int>
来获取中的项目计数unsortedList
,然后order
基于counts字典中的相应值进行循环生成结果,可以使上述速度快几倍。
Lookup
并Dictionary
使用哈希表存储值。为了在哈希表中查找项目,需要根据该值计算哈希值,该值类似于哈希表中该值的估计位置/索引。这仅需要1个或很少的比较,即可查找(或不查找)哈希表中的值。因此,O(n)从中生成Lookup或Dictionary unsortedList
,并且由于哈希表的平均查找时间为O(1),因此仅使用O(m)时间就可以使用Lookup或Dictionary生成结果,从而得出O(n + m)时间复杂度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句