在Ologn时间中检索std :: map的ith元素

问题描述

我的问题与c ++的STL中的std :: map类有关。我的理解是,它是使用红黑树实现的,以允许O(logn)插入,删除和查找,同时保持键的顺序。

我最近遇到了一个问题,我需要访问映射中的第ith个元素,但是该类仅实现了一个迭代器,该迭代器可以一次进入一个条目。换句话说,我需要将迭代器增加i次才能到达映射中的第i个元素。

最终我很好奇是否可以实现std :: map,从而使ith元素的查找可以在O(logn)时间而不是当前的O(n)时间完成。我相信,通过跟踪每个节点左右子树中节点的数量,这是可能的。这样可以搜索第ith个元素(其中node-> num_left / right指示左和右子树中的节点数)

Node* getNodeAtIndex(int i) {
   Node *cur = root;
   int num_to_left=root->num_left,num_to_right=root->num_right;
   while (num_to_left != i) {
      if (i < num_to_left) { // move left
         cur = cur->left;
         num_to_left -= (1 + cur->num_right);
         num_to_right += (1 + cur->num_right);
      } else { // move right
         cur = cur->right;
         num_to_left += (1 + cur->num_left);
         num_to_right -= (1 + cur->num_left);
      }
   }
   return cur;
}

这篇文章Get index of element in C++ map密切相关,但是许多答案都讨论了地图中的第i个元素是如何定义的。但是,我认为它是在某种意义上定义的,即“ ith”元素在映射中具有i个条目的键小于其键,而map.size()-i-1个条目的键大于其键。

我确定已经考虑了这一点,我只是想知道为什么它没有实现。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)