stl RB-Tree(set或map)中的iterator++操作的复杂度是多少?
我一直认为它们会使用索引,因此答案应该是O(1),但最近我阅读了vc10实现并惊讶地发现他们没有这样做。
要在有序的RB-Tree中查找下一个元素,需要花费时间搜索右子树中最小的元素,或者如果节点是左子节点且没有右子节点,则在右兄弟中搜索最小元素。这引入了一个递归过程,因此我认为++运算符需要花费O(lgn)的时间。
我的观点正确吗?所有stl实现都是这种情况还是只有visual C++?
维护RB-Tree的索引真的很难吗?只要在节点结构中保持两个额外指针,我们就可以像RB-Tree一样维护双向链表。他们为什么不这样做呢?
我一直认为它们会使用索引,因此答案应该是O(1),但最近我阅读了vc10实现并惊讶地发现他们没有这样做。
要在有序的RB-Tree中查找下一个元素,需要花费时间搜索右子树中最小的元素,或者如果节点是左子节点且没有右子节点,则在右兄弟中搜索最小元素。这引入了一个递归过程,因此我认为++运算符需要花费O(lgn)的时间。
我的观点正确吗?所有stl实现都是这种情况还是只有visual C++?
维护RB-Tree的索引真的很难吗?只要在节点结构中保持两个额外指针,我们就可以像RB-Tree一样维护双向链表。他们为什么不这样做呢?