【问题标题】:Is It a Bad Practice to Use Dictionary with Dummy Value使用具有虚拟值的字典是一种不好的做法吗
【发布时间】:2017-04-18 01:17:31
【问题描述】:

假设我有两个项目集合,我想找到它们的交集。

由于这些只是值,而不是键值对,因此通常会使用 List 而不是 Dictionary。

但是,查找两个列表的交集需要一个嵌套循环,因此复杂度为 O(n^2),而使用字典所需的时间为 O(n)。

如果我们要处理大量项目,显然我们会尽量避免 O(n^2),所以答案很简单。我的问题更多是关于项目数量很少且不太可能增长的情况。

使用字典是否被认为是一种不好的做法:

  • 键 = 项目类型
  • 值 = {虚拟}

即使性能不是问题,也只是为了持续查找能力?我能想到的缺点是:

  1. 使用比必要更复杂的数据结构。
  2. 让读者感到困惑,因为该值是虚拟的。

【问题讨论】:

标签: c# list dictionary


【解决方案1】:

几乎所有情况下,您应该更倾向于可读性和可维护性而不是性能,尤其是在这种情况下,除非您的集合非常庞大,否则差异可能微不足道。

因此,除非您可以证明通过使用列表的交集存在重大的性能问题,否则您将引入一个大的可维护性问题获得。

最后,考虑一下,如果使用带有虚拟值的字典,您已经用内存换取了 CPU/时间。在某些情况下这可能无关紧要,而在其他情况下可能会破坏交易。

归根结底,这感觉像是过早的优化,应该避免。正如 cmets 中的其他人所提到的,其他选项(例如 HashSet<T>)可以在不编写混淆代码的情况下满足您的性能目标,并且会占用更少的内存。

【讨论】:

  • 中肯的建议
【解决方案2】:

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 的回答一样,如果您的收藏品相对较小,那么麻烦可能真的不值得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2010-12-22
    • 2012-10-23
    • 2014-04-30
    相关资源
    最近更新 更多