【问题标题】:Get the largest key in a dictionary获取字典中最大的键
【发布时间】:2012-01-09 01:14:53
【问题描述】:

我有一本带有整数键的字典。我想得到最大的钥匙。我不跟踪键,因此它们可能是连续的(例如 1,2,3,4,5,6),但可能会跳过(1,3,4,5),尽管我怀疑这有什么区别。

我只是使用二进制搜索还是有方法?据我所知,对于这样一个简单的任务,您几乎无法击败二进制搜索 - 也许您可以将它减半。

【问题讨论】:

  • 字典没有排序,所以二进制搜索对你没有好处。
  • @AustinSalonen Dictionary<K, V> 没有排序,但值得一提的是,有一些 IDictionary<K, V> 的有序实现。

标签: c# dictionary search key binary-search


【解决方案1】:

如果你有可用的 LINQ,你应该能够做到:

myDictionary.Keys.Max();

【讨论】:

  • 对于任何尝试使用此功能的人,您需要确保包含 linq 扩展方法 Imports System.Linq 并在 .net 3.5+ 中编译 - 那就好用了 :)
  • 这是O(n) 的订单还是O(1) 的订单?
  • @Pixel_95:O(n)。对于 O(1),您可以在字典更改时跟踪最大值,就像在 Simon Mourier 的回答中一样。
【解决方案2】:

二分查找是最快的,但不适用于普通字典,因为键不是以任何特定顺序存储的。 @Minitech 的答案,使用 Linq Max(),如果您使用普通字典,是最简单的。

如果这是您必须多次执行的操作,您可以考虑转移到SortedDictionary<TKey, TValue>,它根据键对条目进行排序。

var dict = new SortedDictionary<int, int> {{3, 0}, {12, 0}, {32, 0}, 
                                           {2, 0}, {16, 0}, {20, 0}};
Console.WriteLine(dict.Keys.Last()); //prints 32

编辑:这可能比普通字典慢。我想最好提一下。这是因为字典中的条目以不同的方式存储(红/黑树与哈希桶/哈希表)

一点,SortedDictionary 变得比普通的Dictionary 更快。然而,这可能是大约 100 万个项目,但这只是一个猜测。事实证明,在这么多项目上它快了大约 10 倍(但无论如何我们谈论的是 100 分之一秒,所以它真的重要吗?)。对于 100000 个项目,它在 x64 版本上大致相等。考虑到将项目添加到字典中有额外的开销,这可能不值得。另外,我通过覆盖比较器“欺骗”了一点,所以它会以相反的顺序排序,所以我实际上是在做 dict.Keys.First() 而不是最后一个来获得最大的项目。

如果您需要按顺序遍历所有键值对,SortedDictionary 确实适用。我认为@SimonMourier 的回答可能是最好的。我向您保证这是最快的,而且开销最小。

【讨论】:

  • 由于字典已经排序,所以也可以使用下面的代码:dict.Last().Key;
【解决方案3】:

如果性能确实是个问题,我会在现有类的基础上创建一个新类,实现标准接口,如下所示:

    public class RememberMaxDictionary<K, V> : IDictionary<K, V> where K: IComparable<K>
    {
        private Dictionary<K, V> _inner;

        public RememberMaxDictionary()
        {
            _inner = new Dictionary<K, V>();
        }

        public K MaxKey { get; private set; }

        public void Add(K key, V value)
        {
            _inner.Add(key, value);

            if (key.CompareTo(MaxKey) > 0) // test null if needed
            {
                MaxKey = key;
            }
        }

    ... TODO implement the rest...

【讨论】:

  • 这是误导。您省略了 MaxKey 减少的部分(假设需要删除一个条目,在大多数情况下是这样)。 'Remove' 方法以有效的方式实现并非易事。
  • @Dixtosa - 取决于您的上下文和需求。写下你自己的答案。
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多