分析此方法

时间:2012-02-08 16:32:35

标签: algorithm code-analysis

我在分析此方法时遇到问题。我想弄清楚大的复杂性。 如果我是对的那么它是O(n ^ 2)因此两个for循环,这是算法的主要联合。但我似乎无法弄清楚如何证明它。

我到目前为止的事情是。

1 + N *((N-1)+1)/ 2 + N。但是,当我测试它时,它是对的,可以吗?

文字是挪威文,如果您对理解代码有任何疑问,请大声说出来。 (应该用英语编码,但是因为我们的老师用挪威语提供所有材料,他们希望用挪威语。所以英语和挪威语文本:P)

public void skrivUtStat(){
    LinearNode<CD> temp = start;
    int[] amt = new int[CD.GenreAmt()];
    String[] genre = CD.sendGenre();

    if(amount != 0){
        for(int i=0; i<amount; i++){
            for(int j=0; j<CD.genreAmount(); j++){
                if(temp.getElement().getGenreNr() == j){
                    ant[j] += 1;
                }
            } // End inner for-loop
            temp = temp.GetNext();                              // O(1)
        }// End outer for-loop

        for(int a=0; a<CD.GenreAmt(); a++){
            System.out.println(Genre[a] + ":");
            System.out.println(ant[a]);
        }
    }
}

现在编辑为英文。

1 个答案:

答案 0 :(得分:1)

据我所知,CD.genreAmount()是O(1),你有一个固定的流派列表。正确?

在这种情况下,您将遍历所有CD(for i)并根据整个流派全局列表(for j)检查每个CD。所以:

存在:

  • N = CD计数
  • M =流派计数

订单将O(N.M)

当然:你的算法再次迭代你的类型(在方法结束时),但那将是N.M + M,当然O(M)总是低于O(NM)......因此O(N.M+M)相当于O(N.M)