gpt4 book ai didi

c# - 对于一个只能包含唯一项目但在 99% 的时间里包含 0 或 1 个项目的列表,开销是否使 List 比 HashSet 更好?

转载 作者:行者123 更新时间:2023-11-30 14:10:23 24 4
gpt4 key购买 nike

我目前正在开展一个项目,我们有一系列事件。我们对事件进行的一项分析是查看特定类型的事件,并检查它是否可能是由另一个事件引发的,该事件发生在不久之前(或者在一个奇怪的情况下稍晚)。这些事件中的每一个都只能受一个事件的影响,但一个事件可能是多个事件的因果事件。我们希望这种关联是双向的,这样,从任何特定方法,您都可以直接转到导致它的事件,或者它导致的事件之一。基于此,我首先将以下属性添加到 Event 对象并添加一个函数:

protected Event causalEvent;
protected List<Event> effectedEvents;

经过一番思考,我认为我们绝不希望将同一项目添加两次到 effectedEvents 列表中。阅读Preventing Duplicate List<T> Entries的答案后,我选择了哈希集。

protected Event causalEvent;
protected HashSet<Event> effectedEvents;

我和一位同事开始讨论我添加的代码,他指出使用 HashSet 可能会让人们感到困惑,因为他倾向于看到 HashSet并假设有大量数据。在我们的例子中,由于算法中使用的规则,effectedEvents 将在大约 90% 的情况下有 0 个项目,在 9% 的情况下有 1 个项目,而 2 个可能是 1% 的时间.我们几乎永远不会拥有超过 2 件元素,尽管这是可能的。我相信这两个集合的查找成本是相同的。使用的内存量非常相似,因为两者都开始假设容量很小(尽管我承认 List 使您能够在构造函数中设置该容量,而 HashSet只允许根据其内容削减值,“四舍五入为特定于实现的值”)。

所以,长话短说,使用 HashSet 是否有任何真正的惩罚,除了可能让那些不熟悉使用它来确保唯一性的人感到困惑之外?

最佳答案

执行的分析in this answer表示当您达到 5 个字符串或 20 个对象时,您只会看到 HashSet 优于 List 的性能优势(当然,结果会因您所做的事情而异) .由于在几乎所有情况下您都会有 0-2 个项目,因此在性能方面最好的选择可能是使用 List

我不会担心那些不熟悉使用 HashSet 来确保唯一性的人会感到困惑。这是 HashSet 的主要用途之一。选择最适合工作的工具,如果您认为人们会感到困惑,简短的评论可以帮助解决这个问题。

此外,虽然使用性能最佳的编码策略是件好事,但您也应该注意不要在可能为时过早的微优化上花费太多时间。除非您使用很多这些对象,否则在这种情况下您可能永远不会注意到ListHashSet 之间的区别。

关于c# - 对于一个只能包含唯一项目但在 99% 的时间里包含 0 或 1 个项目的列表,开销是否使 List 比 HashSet 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24294021/

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