Основная теорема для нахождения временной сложности рекуррентного отношения

#algorithm #recursion #time-complexity #master-theorem

#алгоритм #рекурсия #временная сложность #основная теорема

Вопрос:

Я пытался понять и реализовать основную теорему для нахождения временной сложности рекуррентных отношений.

Но я не могу понять, как мы можем вычислить временную сложность алгоритма, используя его.

Рассмотрим этот алгоритм для нахождения диаметра двоичного дерева

 class Node 
{
    int data; 
    Node left, right; 

    public Node(int item) 
    { 
        data = item; 
        left = right = null; 
    }
}





/* Class to print the Diameter */

    class BinaryTree 

{ 
    Node root; 

    /* Method to calculate the diameter and return it to main */
    int diameter(Node root) 
    { 
        /* base case if tree is empty */
        if (root == null) 
            return 0; 

        /* get the height of left and right sub trees */
        int lheight = height(root.left); 
        int rheight = height(root.right); 

        /* get the diameter of left and right subtrees */
        int ldiameter = diameter(root.left); 
        int rdiameter = diameter(root.right); 

        /* Return max of following three 
          1) Diameter of left subtree 
         2) Diameter of right subtree 
         3) Height of left subtree   height of right subtree   1 */
        return Math.max(lheight   rheight   1, 
                        Math.max(ldiameter, rdiameter)); 

    } 

    /* A wrapper over diameter(Node root) */
    int diameter() 
    { 
        return diameter(root); 
    } 

    /*The function Compute the "height" of a tree. Height is the 
      number f nodes along the longest path from the root node 
      down to the farthest leaf node.*/
    static int height(Node node) 
    { 
        /* base case tree is empty */
        if (node == null) 
            return 0; 

        /* If tree is not empty then height = 1   max of left 
           height and right heights */
        return (1   Math.max(height(node.left), height(node.right))); 
    } 

    public static void main(String args[]) 
    { 
        /* creating a binary tree and entering the nodes */
        BinaryTree tree = new BinaryTree(); 
        tree.root = new Node(1); 
        tree.root.left = new Node(2); 
        tree.root.right = new Node(3); 
        tree.root.left.left = new Node(4); 
        tree.root.left.right = new Node(5); 

        System.out.println("The diameter of the given binary tree is: "
                             tree.diameter()); 
    } 
} 
  

Я знаю, что временная сложность вышеупомянутого алгоритма равна O (n ^ 2)
Просто взглянув на это. Поскольку каждый узел вызывается много раз для одной рекурсии.

Как я могу найти временную сложность этого алгоритма, используя основной метод?

Я совершенно новичок в нахождении временной сложности рекурсивных функций. и я думаю, что основная теорема — это способ вычислить временную сложность рекурсивной функции.

Как я могу найти временную сложность рекурсивных алгоритмов, используя основной метод или любой другой метод?

Было бы большим подспорьем, если бы кто-нибудь научил меня, как находить временную сложность рекурсивных функций.

Спасибо!

Ответ №1:

Если мы предположим, что двоичное дерево сбалансировано, общая временная сложность равна T(n) , и T(n) = 2T(n/2) 2T(n/2) 1 . Первый 2T(n/2) для диаметров (левый и правый) и второй 2T(n/2) для высоты (левая и правая высота). Следовательно T(n) = 4T(n/2) 1 = O(n^2) (первый случай основной теоремы).

Комментарии:

1. Как вы пришли к этому соотношению? Я хочу этому научиться!

2. и как 4t (n/2) 1 = O (n ^ 2). Извините. Возможно, я звучу неубедительно. Но я действительно слаб в этом