我们说我有两个项目集合,我想找到他们的交集。
由于这些只是值,而不是键值对,因此通常使用List而不是Dictionary。
然而,找到两个列表的交集需要一个嵌套循环,因此O(n ^ 2)复杂度,而对于Dictionary,所需时间为O(n)。
如果我们处理大量项目,显然我们会尽量避免O(n ^ 2),所以答案很简单。我的问题更多的是项目数量很少而且不太可能增长的情况。
将字典用于:
是否被视为不良做法即使性能不是一个问题,只是为了获得持续的查找能力?我能想到的缺点是:
答案 0 :(得分:7)
在 几乎所有 的情况下,您应该支持可读性和可维护性而不是性能,尤其是在这种情况下,除非您的馆藏很大,否则差异可能微不足道。
因此,除非您 证明 通过使用列表的交集存在显着的性能问题,否则您将引入一个很大的可维护性问题获得的。
最后,考虑如果使用具有虚拟值的字典,则已经为cpu / time交换了内存。在某些情况下这可能无关紧要,而在其他情况下可能会成为交易破坏者。
在一天结束时,这感觉就像是过早优化,应该避免。正如评论中其他人所提到的,HashSet<T>
等其他选项可以在不编写混淆代码的情况下满足您的性能目标,并且可以使用更少的内存。
答案 1 :(得分:4)
HashSet<T>
类在功能上类似于具有虚拟值的Dictionary<T>
。它也是为这种集合操作而设计的:
var hashset = new HashSet(myList1); // this is O(n)
hashset.IntersectWith(myList2); // this is O(n+m)
https://msdn.microsoft.com/en-us/library/bb293080(v=vs.110).aspx
但正如@ DavidL的回答一样,如果你的藏品相对较小,那真的可能不值得。