按数组中定义的顺序对字符串列表进行排序的有效方法?

时间:2019-06-30 18:18:38

标签: c# arrays list sorting

我试图按另一个数组中定义的顺序对字符串List进行排序。我知道可以通过多种方式来实现,但是我不确定如何有效地做到这一点。我需要它来处理大量的未排序列表,其中包含数千个项目。这是我想出的:

class Solution:
def countUnivalSubtrees(self, root):
    if root is None: return 0
    self.count = 0
    self.is_uni(root)
    return self.count

def is_uni(self, node):
    if node.left is None and node.right is None:
        self.count += 1
        return True
    is_uni = True
    if node.left:
        is_uni = self.is_uni(node.left) and is_uni and node.left.val == node.val
    if node.right:
        is_uni = self.is_uni(node.right) and is_uni and node.right.val == node.val
    self.count += is_uni
    return is_uni

它可以按预期工作,但是绝对没有效率。我有什么办法可以在不遍历列表和订单的情况下做到这一点?

编辑:澄清

谢谢!

4 个答案:

答案 0 :(得分:3)

最简单的表示方法是使用正确的内部联接:

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以根据其中的相应值来生成结果,可以使上述速度快几倍。计数字典。


LookupDictionary使用hash table存储值。为了在哈希表中查找项目,从该值计算出哈希值,这类似于该值在哈希表中的估计位置/索引。这样仅需要1个或很少的比较就可以查找(或不查找)哈希表中的值。因此,O(n)从unsortedList生成Lookup或Dictionary,并且由于哈希表具有平均O(1)查找时间,因此仅O(m)时间就可以使用Lookup或Dictionary生成结果,从而总O(n + m)时间复杂度。

答案 1 :(得分:0)

考虑到您的评论,您可以简单地按照order数组中的索引对列表进行排序:

 List<string> sortedList = unsortedList.OrderBy(x => Array.IndexOf(order, x));

答案 2 :(得分:0)

基于@Ashkan的答案,您可以执行order.Distinct().ToList(),该操作将删除重复项。由于订单已经排序,因此您只需处理然后返回即可。

答案 3 :(得分:0)

您可以使用将数组索引用作排序输入的高效排序算法。这将比示例解决方案更有效。

例如,

List<string> sortStringListByArray(List<string> unsortedList, string[] order)
{
    var orders = new Dictionary<string, int>();

    for (var i = 0; i < order.Length; i++)
        orders[order[i]] = i;

     return unsortedList
         .OrderBy(s => orders[s])
         .ToList();
}