我有游戏对象的n-ary树。用户随机选择树中的一些对象并想要删除。问题是某些物体是另一物体的子物。事实证明,每次删除层次结构内的节点后,我必须遍历所有选定的节点并将其删除。算法比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-ary和O(n ^ 2)中的n是相同的符号吗?