gpt4 book ai didi

c# - 从列表中删除重复值的最佳算法

转载 作者:太空狗 更新时间:2023-10-29 22:12:29 24 4
gpt4 key购买 nike

从列表中删除重复值的最佳算法是什么?我试过这个:

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--;
}

}
}
}

这里,AuthorGroupNodes 是节点列表。它在某种程度上做对了事情,但并不完美。谁有更好的解决方案???

最佳答案

您当前的算法是 O(N-squared),对于大型列表,它的性能会很差。

如果空间不是问题,您可以保留 HashSet<int>节点的哈希值。遍历列表一次。如果该节点的哈希值在 HashSet 中,您就知道这是一个重复节点。跳过它。如果该哈希不在HashSet中,则将该节点添加到一个新列表中,并将该节点的哈希添加到HashSet中。

这将执行 O(N),并且需要内存用于原始列表、列表副本减去任何重复项以及 HashSet。该算法是非破坏性的。

如果你会使用 Linq,就去做

var distinctList = originalList.Distinct().ToList();

更新

发现这几乎就是 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/

关于c# - 从列表中删除重复值的最佳算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com