为什么 SortedDictionary.GetEnumerator() 根据 Microsoft Docs 是 C# 中的 O(log n) 操作?
Why SortedDictionary.GetEnumerator() is an O(log n) operation in C# according to Microsoft Docs?
根据 Microsoft Doc, the SortedDictionary.GetEnumerator()
method is an O(log n) operation in C#. SortedDictionary
is backed by SortedSet
. Looking at .NET source 行 1911 到 1923,当调用 GetEnumerator()
方法时,会实例化一个新的 Enumerator,它会在内部创建一个 Stack<T>
。然后在Initialize()方法中填入Stack<T>
。这是一个 O(n) 操作,而不是 O(log n)!
如果有人能解释 O(log n) 的原因,我将不胜感激。
the Stack is filled in in the Initialize() method. This is an O(n) operation, not O(log n)!
不,不是真的。 Stack<T>
集合仅填充到表示已排序数据的二叉树的最深层。 Initialize()
方法遍历二叉树,将数据节点压入堆栈,直到它到达将由枚举器返回的第一个节点。
二叉树的深度是log n,Initialize()
方法只在树的每一层循环一次,所以循环的代价也是O(log n)。正如文档所说。
枚举集合的总体 成本为 O(n),但简单地初始化枚举器仅为 O(log n)。
根据 Microsoft Doc, the SortedDictionary.GetEnumerator()
method is an O(log n) operation in C#. SortedDictionary
is backed by SortedSet
. Looking at .NET source 行 1911 到 1923,当调用 GetEnumerator()
方法时,会实例化一个新的 Enumerator,它会在内部创建一个 Stack<T>
。然后在Initialize()方法中填入Stack<T>
。这是一个 O(n) 操作,而不是 O(log n)!
如果有人能解释 O(log n) 的原因,我将不胜感激。
the Stack is filled in in the Initialize() method. This is an O(n) operation, not O(log n)!
不,不是真的。 Stack<T>
集合仅填充到表示已排序数据的二叉树的最深层。 Initialize()
方法遍历二叉树,将数据节点压入堆栈,直到它到达将由枚举器返回的第一个节点。
二叉树的深度是log n,Initialize()
方法只在树的每一层循环一次,所以循环的代价也是O(log n)。正如文档所说。
枚举集合的总体 成本为 O(n),但简单地初始化枚举器仅为 O(log n)。