【问题标题】:time and space complexity creating vector of elements at each levels of a binary tree(NON-BST)时间和空间复杂度在二叉树的每一层创建元素向量(非 BST)
【发布时间】:2015-03-24 23:36:50
【问题描述】:

你能帮我理解计算以下函数的时间和空间复杂度吗?

函数(): 作用:在每一层创建节点向量

  1. 创建一个队列。
  2. 添加根
  3. 将队列中的元素复制到向量中。
  4. 遍历向量并将子项(左和右)附加到队列中。
  5. 重复步骤 3 和 4,直到队列为空。

下面是代码。

struct node {
     int value;
     struct node* p_left;
     struct node* p_right;
};

void levels_list(struct node* p_btree) {
     if(!p_btree) {
          return ;
     }


     std::queue<struct node*> q;
     std::vector<std::vector<struct node*> > v1;

     q.push(p_btree);
     bool choice = false;

     while(!q.empty()) {
          std::vector<struct node*> v;

          while(!q.empty()) {
               v.push_back(q.front());
               q.pop();
          }

          for(int i = 0; i < v.size(); i++) {
               if(v[i]->p_left) {
                    q.push(v[i]->p_left);
               }
               if(v[i]->p_right) {
                    q.push(v[i]->p_right);
               }
          }

          v1.push_back(v);
          v.clear();
     }
}

我看到它是 O(n^2),对吗? 有两个循环,第一个是外部循环,第二个是内部循环,它将元素从队列中推入向量中。

谢谢

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    在每次迭代开始时,q 有一组节点。在每次迭代结束时,q 有一组子代。所以循环的每一次迭代都是一个层次。

    每个级别只处理该级别的节点。推回向量是O(1),从队列推入和弹出是O(1)(摊销)。

    我们没有做任何比这更精彩的事情。所以这是O(n) 计算时间。由于 v 和 q 的大小永远不会大于 n(如果 bt 中有完整的行,它将是ciel(n/2)),并且 v1 仅包含每个节点之一,这也是 O(n) in空间。

    话虽如此,上面的代码是一个很好的例子,说明了如何编写一个复杂的精细算法。你最终做了很多不必要的复制和分配......没有理由使用这样的队列,甚至任何中间数据结构......你知道输出向量并且可以跟踪每个级别的限制位于输出向量中,因此您可以对其进行迭代,直到达到大小为 0 的级别。如果您知道 BST 的元素数量,您可以预先分配它,它会很好并且缓存友好。

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多