我试图按另一个数组中定义的顺序对字符串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
它可以按预期工作,但是绝对没有效率。我有什么办法可以在不遍历列表和订单的情况下做到这一点?
编辑:澄清
谢谢!
答案 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
以根据其中的相应值来生成结果,可以使上述速度快几倍。计数字典。
Lookup
和Dictionary
使用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();
}