微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据 Microsoft Docs,为什么 SortedDictionary.GetEnumerator() 是 C# 中的 O(log n) 操作?

如何解决根据 Microsoft Docs,为什么 SortedDictionary.GetEnumerator() 是 C# 中的 O(log n) 操作?

根据Microsoft DocSortedDictionary.GetEnumerator() 方法是C# 中的O(log n) 操作。 SortedDictionarySortedSet 支持。查看 .NET source 行 1911 到 1923,当调用 GetEnumerator() 方法时,会实例化一个新的 Enumerator,它会在内部创建一个 Stack<T>。然后在 Initialize() 方法中填充 Stack<T>。这是一个 O(n) 操作,而不是 O(log n)!

如果有人解释 O(log n) 的原因,我将不胜感激。

解决方法

Stack 是在 Initialize() 方法中填充的。这是一个 O(n) 操作,而不是 O(log n)!

不,不是真的。 Stack<T> 集合仅填充到表示排序数据的二叉树的最深级别。 Initialize() 方法遍历二叉树,将数据节点压入堆栈,直到到达枚举器将返回的第一个节点。

二叉树的深度是log n,Initialize()方法在树的每一层只循环一次,所以循环的代价也是O(log n)。就像文档说的那样。

枚举集合的总体成本将为 O(n),但简单地初始化枚举器仅为 O(log n)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。