c++ - 从 n 叉树中有效地删除节点列表
问题描述
我有游戏对象的 n 叉树。用户随机选择树中的一些对象并想要删除。问题是某些对象是另一个对象的子对象。事实证明,每次删除层次结构中的节点后,我都必须遍历所有选定的节点并将其删除。该算法是否比 O (n^2) 更快?
更新:为了更清楚我需要什么,我编写了伪代码:
struct TreeNode
{
vector<TreeNode*> childs;
};
void removeNodeHierarchy(list<TreeNode*>& nodes, TreeNode *n)
{
for(TreeNode *child : n->childs())
removeNodeHierarchy(nodes, child);
nodes.remove(n); // complexity nodes.size()
delete n;
}
// The function I'm trying to write
// Problem: Total complexity = nodes.size() * nodes.size()
void removeNodes(list<TreeNode*>& nodes, TreeNode *root)
{
while (!nodes.empty()) // complexity nodes.size()
{
TreeNode *n = nodes.first();
removeNodeHierarchy(nodes, n);
}
}
void main()
{
TreeNode *tree = ...
list<TreeNode*> nodes = ...
removeNodes(nodes, tree);
}
解决方案
为了搜索该节点,它将花费您 O(n^d),其中 d 是树的深度。因此,如果 d < 2 会更快,我认为对于大型游戏树来说几乎不会出现这种情况。你确定 n 中的 n 和 O(n^2) 是同一个符号吗?
推荐阅读
- java - 使用 netbeans 在 jPanel-GUI 中实现视频(“预览”)播放器
- visual-studio - 如何不自动将焦点设置到 CrystalReportViewer?
- javascript - 按当月过滤mongodb数据
- javascript - 如何将 localStorage 项目计数(按值)放入局部变量?
- java - 控制器未收到来自 POSTMAN 的上传文件
- r - R基于字符串列中的元素重复行
- python - 寻找正确方向的一点——用python打开MPEG-2传输流
- javascript - 如何在同一帖子详细信息页面上显示带有 ajax 提交调用的评论
- jquery - 如何将jquery添加到茉莉花
- c++ - 在 C/C++ 编程中从较小地址中减去较大地址时,输出表示什么?