如何计算这些方法/算法的计算复杂度?

时间:2015-06-01 20:32:40

标签: java algorithm data-structures tree

我正在做一个关于Java中k-ary树实现的普遍项目,现在我需要计算我之前实现的一些方法(或算法)的计算复杂度(最坏情况)。

在每个方法的最后,我写了我认为该方法的计算复杂性应该是。

int ar; //arity of tree, given by user
List<Node<T>> children = new ArrayList<Node<T>>(ar);

public void addChild(Node<T> n) {
    if(this.numberOfChildren()>=ar){
        System.out.println("Impossible to add: "+n.getInfo());
    }else{
        for(int i = 0; i<ar; i++){
            if(this.children.get(i)==null){
                n.setParent(this);
                this.children.set(i,n);
                break;
            }
        }
    }
}

计算复杂度:O(n)。

public int numberOfChildren() {
    int count = 0;
    for(int i = 0; i<ar; i++){
        if(this.children.get(i)!=null){
            count++;
        }
    }
    return count;
}

计算复杂度:O(n)。

public LinkedList<T> visitDFSA() {
    LinkedList<T> nodiVisita=new LinkedList<T>();
    LinkedList<Node<T>> stack=new LinkedList<Nodo_m_ario<T>>();
    stack.addFirst(this.root);
    while(!stack.isEmpty()){
        Nodo_m_ario<T> u=stack.removeFirst();
        if(u!=null){
            nodiVisita.addLast(u.getInfo());
            for(int i=Node.ar-1;i>=0;i--){
                stack.addFirst((u.childrenList().get(i)));
            }
        }
    }
    return nodiVisita;
}

计算复杂度:O(n²)。

public LinkedList<T> simmetricVisit(Node<T> node) {
    if (node==null){

    }else{
        for (int i=0;i<Node.ar/2;i++){
            simmetricVisit(node.children.get(i));
        }
        vs.add(nodo.getInfo());
        for (int i=Node.ar/2;i<Node.ar;i++){
            simmetricVisit(node.children.get(i));
        }
    }
    return vs;
}

计算复杂度:O(n)。

public void graft(Node<T> u, Tree<T> subTree) {
    if(u==null){
        System.out.println("Can't add the subtree to node u.");
    }else{
        Node<T> rootSubTree = subTree.getRoot();
        rootSubTree.parent = u;
        u.addChild(rootSubTree);
    }
}

计算复杂性:O(1)。

我写的内容是否有问题(谈论计算复杂性值)? 我认同。 所以我想我可能需要一些帮助...... :(

1 个答案:

答案 0 :(得分:1)

方法void addChild(Node<T> n)int numberOfChildren()

这些方法中的每一个都会执行单个循环的ar次迭代。假设在这些循环中执行的操作(不同numberOfChildren()Node.setParent()Node.getInfo())为O(1),这些方法为O(ar),即{{1}除非你用arity做一些非常奇怪的事情。或者,对于任何给定的O(1) 作为常量,这些方法绝对是ar,无论为O(1)选择的实际值如何。

方法arLinkedList<T> visitDFSA()

这些不太明显,但似乎每种方法只访问每个节点一次,每次访问费用LinkedList<T> simmetricVisit(Node<T> node)。这使得这两种方法O(ar)总体上用于O(n * ar)个总节点。如果n被认为是O(n),如果保证树高可能是最小值,那么这与ar一样好。如果这些方法不必处理O(1)个孩子,而只处理真正的孩子,那么它也是O(n)

Method void graft(Node u,Tree subTree)

假设nullNode.addChild()均为Tree.getRoot(),则执行固定的最大操作数。那是O(1)