图中级别顺序遍历的时间复杂度

问题描述

时间复杂度:O(n) 谁能在数学上将时间复杂度解释为O(n)。 我发现 while 循环为O(logn)

public:
    vector<vector<int>> levelOrder(Node* root) {
        if(!root) return vector<vector<int>>{};
        queue<Node*> q;
        q.push(root);
        vector<vector<int>> res;
        
        while(!q.empty()){
            //BFS traversal
            int size= q.size();
            vector<int> level;
            
            for(int i= 0; i< size; i++){
                auto tmp= q.front(); q.pop();
                level.push_back(tmp->val);
                for(auto n: tmp->children)
                    q.push(n);
            }
            res.push_back(level);
        }
        return res;
    }
}

解决方法

那么您一次访问每个节点只有一次,所以这里的复杂度将是O(n)。这个问题不是“分而治之”的算法,因为wou最终将访问节点的所有分支(在二分算法中,您仅访问一个分支)。

编辑

递归算法的复杂性确实很棘手。这个公式可以帮助您:当您的时间复杂度为T(n)时,

T(n)= aT(n / b)+ f(n)。

如果f(n)=Θ(n d ),其中d≥0,则

    如果a d ,
  • T(n)=Θ(n d ) 如果a = b d
  • ,则
  • T(n)=Θ(n d * log(n)) 如果a> b d
  • T(n)=Θ(n log b (a)

在您的情况下,f(n)=Θ(1),因为您在节点上什么也不做,所以d = 0。通常,您还具有a = b> 1,因此您处于第三种情况。 Log b (a)= 1,因为b = a,所以您的复杂度为Θ(n 1 )。