【问题标题】:Why does this level order traversal run in O(n) time?为什么这个级别顺序遍历在 O(n) 时间内运行?
【发布时间】:2020-07-31 16:59:31
【问题描述】:
    vector<vector<int>> levelOrder(TreeNode* root) {

        queue<TreeNode*> bfs;
        if (root != nullptr) bfs.push(root);
        vector<vector<int>> sol;
        vector<TreeNode*> temp; 
        vector<int> indivSol;
        
        while (!bfs.empty()) {
            
            int currSz = bfs.size();
            for (int i = 0; i < currSz; i++) {
                temp.push_back(bfs.front());
                bfs.pop();
                
                indivSol.push_back(temp.at(i)->val);                

                if (temp.at(i)->left != nullptr) bfs.push(temp.at(i)->left);
                if (temp.at(i)->right != nullptr) bfs.push(temp.at(i)->right);
            }
            
            temp.clear();
            sol.push_back(indivSol);
            indivSol.clear();
            
        }
        
        return sol;
    }

我知道外部 while 循环将运行 n 次(n 是树中的节点数),但内部 for 循环会使解决方案在 O(n^2) 时间内运行吗?由于一棵树在n 级别上最多有2^n 节点,因此currSz 可以从1 to 2 to 4 to 8 to 16 ... 的外部循环的每次迭代中增长

编辑: 意识到外部循环只会运行l 多次,其中l 是级别数

【问题讨论】:

  • O(n)的解释是什么?
  • n 是什么意思?节点数?等级数?还有什么?

标签: c++ algorithm big-o


【解决方案1】:

忘记一切,回想一下,当您使用此代码执行级别顺序遍历时,您会访问每个节点一次。因此,如果树中总共有k 个节点,那么时间复杂度将为 O(k)。

h : 树的高度

while 循环运行h 次,并且在每次迭代(即在每个级别)时,它都会遍历该级别中存在的所有节点。所以类似地,这适用于导致 O(n) 的每次迭代(级别)(n 是节点总数)

【讨论】:

    【解决方案2】:

    另一种将问题视为广度优先搜索的特殊版本的方法。

    在 BFS 中,您访问每个节点的邻接关系(确保不要进入循环)。这意味着总成本是所有邻接的总和,即有向图的边数和无向图的边数的两倍。

    在树中,每个节点都有一个唯一的父节点,因此边数等于节点数减一,因此成本为 O(n)。

    【讨论】:

      【解决方案3】:

      使用amortized runtime analysis 了解为什么这是 O(n)。

      简而言之,摊销分析通过建立数据(或某些其他资源)被操纵的次数而不是发生的原子操作的绝对数量(过于悲观)来限制运行时间。

      通常使用 BFS,您需要一个数据结构来跟踪已访问过哪些节点,但这似乎作用于一棵树,以确保每个节点只会被访问一次(因为每个节点在遍历中都有一个唯一且只有一个父节点.) 鉴于此算法在每次访问节点时执行恒定数量的操作,这是 O(n)。

      存在嵌套循环的事实是red herring,因为通过此分析,您可以保证它是 O(n)。

      【讨论】:

        猜你喜欢
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 2021-03-10
        相关资源
        最近更新 更多