时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
time and space complexity creating vector of elements at each levels of a binary tree(NON-BST)
您能否帮助我了解计算以下函数的时间和空间复杂度。
函数(): 角色:创建每个级别的节点向量
- 创建队列。
- 添加根
- 将队列中的元素复制到向量。
- 遍历向量并将子项(左和右)附加到队列中。
- 重复步骤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),我说得对吗?有两个循环,第一个是外部循环,第二个是内部循环,它将元素从队列推送到向量中。
谢谢
在每次迭代开始时,q
都有一组节点。在每次迭代结束时,q
都有一组子项。因此,循环的每次迭代都是一个级别。
每个级别仅处理该级别的节点。推回向量是O(1)
,从队列中推送和弹出是O(1)
(摊销)。
我们没有比这更花哨的事情了。所以这是O(n)
计算时间。由于 v 和 q 的大小永远不会大于 n(如果 bt 中有完全完整的行,它将是 ciel(n/2)
),并且 v1 只包含每个节点的一个,因此这也在空间中O(n)
。
话虽如此,上面的代码是一个很好的例子,说明如何编写一个复杂的精细算法。您最终会做很多不必要的复制和分配...没有理由使用这样的队列,甚至任何中间数据结构......您知道输出向量,并且可以跟踪每个级别在输出向量中的位置限制,因此您可以迭代它,直到达到大小为 0 的级别。如果您知道BST的元素数量,则可以预先分配它,它会很好并且缓存友好。
相关文章:
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- push_back通过自行创建的对象获取最后一个元素的向量
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- std::map:当元素不可默认构造时创建/替换元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 从转换后的容器元素创建离散分布
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- gStreamer 将元素添加到通过 gst_parse_launch 创建的管道中
- 我无法在用forward_as_tuple创建的元组中按类型访问元素
- 试图为命名数组元素创建一个更好的循环
- C++向量元组,请按索引从元素创建元组
- C++如何为向量中的每个元素创建一个新对象?
- 如何使用枚举元素创建对象
- 如何按类型为元组元素创建专用函数
- 如何从 std 容器的迭代器为成员元素创建迭代器
- Unity:我将如何在C++中为Unity使用的一些元素创建图形
- 用于从 std::map 的最后 n 个元素创建 std::vector 的惯用C++
- 用c++中链表A和链表B的共同元素创建一个linkedListC
- VS2013:无法从一个size_t元素创建矢量