我正在做一个关于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)。
我写的内容是否有问题(谈论计算复杂性值)? 我认同。 所以我想我可能需要一些帮助...... :(
答案 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)
选择的实际值如何。
ar
和LinkedList<T> visitDFSA()
这些不太明显,但似乎每种方法只访问每个节点一次,每次访问费用LinkedList<T> simmetricVisit(Node<T> node)
。这使得这两种方法O(ar)
总体上用于O(n * ar)
个总节点。如果n
被认为是O(n)
,或,如果保证树高可能是最小值,那么这与ar
一样好。如果这些方法不必处理O(1)
个孩子,而只处理真正的孩子,那么它也是O(n)
。
假设null
和Node.addChild()
均为Tree.getRoot()
,则执行固定的最大操作数。那是O(1)
。