从列表中删除重复值的最佳算法是什么?
我试过这个:
for (int i = 0; i < AuthorCounter-1; i++)
{
for (int j = 0; j < AuthorCounter-1; j++)
{
if (i != j)
{
if (AuthorGroupNode.Nodes[i].Text == AuthorGroupNode.Nodes[j].Text)
{
AuthorGroupNode.Nodes[j].Remove();
AuthorCounter--;
}
}
}
}
Here, AuthorGroupNodes
是节点上的列表。它在某种程度上做对了事情,但并不完美。大家有更好的解决办法吗???
您当前的算法是 O(N-squared),对于大型列表来说其性能会很差。
如果空间不是问题,您可以保留一个HashSet<int>
节点的哈希值。遍历列表一次。如果该节点的哈希值在 HashSet 中,则您知道这是一个重复节点。跳过它。如果该hash不在HashSet中,则将此节点添加到一个新列表中,并将该节点的hash添加到HashSet中。
这将执行 O(N),并且需要用于原始列表、列表的副本(减去任何重复项)以及 HashSet 的内存。该算法是非破坏性的。
如果您可以使用 Linq,只需执行以下操作
var distinctList = originalList.Distinct().ToList();
UPDATE
发现这几乎正是 Jon Skeet 重新实现 Distinct 的方式。
public static IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source)
{
return source.Distinct(EqualityComparer<TSource>.Default);
}
public static IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return DistinctImpl(source, comparer ?? EqualityComparer<TSource>.Default);
}
private static IEnumerable<TSource> DistinctImpl<TSource>(
IEnumerable<TSource> source,
IEqualityComparer<TSource> comparer)
{
HashSet<TSource> seenElements = new HashSet<TSource>(comparer);
foreach (TSource item in source)
{
if (seenElements.Add(item))
{
yield return item;
}
}
}
https://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-14-distinct/ https://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-14-distinct/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)