如何找到这个功能的大O.

时间:2015-10-18 02:05:44

标签: java loops big-o concept

所以我有这个函数在Java中迭代8x8多维数组。我试图在findTheBoss()中理解这个函数的大O.它在静态8x8网格中搜索给定的字符串。我真的想了解如何找到像这样的基本功能的Big O.我认为这是O(n ^ 2),但我不确定。请帮助我了解如何找到此功能的等式。

public static void FindTheBoss(String[][] bossGrid, String bossName){

    for(int i=0; i < bossGrid.length; i++)
    {               
        //Iterate through each row?

        for(int j=0; j < bossGrid[i].length; j++)
        {

            if(bossGrid[i][j].equals(bossName))
            {

                System.out.println("Found '" + bossName + "' at position "+ i + "," + j);
                break;
            }
        }

    }   

}

2 个答案:

答案 0 :(得分:2)

你几乎是对的。但是要小心,大O符号可能很棘手,即使你有条不紊也没那么复杂。

让我们总结一下你的代码所做的事情:你收到一个大小为NxN的2D数组和一个长度为S的字符串,并尝试在矩阵中找到字符串(一次或多次)。即使你打破循环一次,也只是假设它没有发生那么多。然后,您只需迭代此矩阵的元素,并比较每个元素的两个字符串。

基本上,如果你说这个算法是O(N ^ 2),它可能是公平的。但要小心知道N是什么。如果您的网格可以有N行和M列,您可以说该算法为O(N * M),仅在方形情况下为O(N ^ 2)(这是一个非常常见的错误)。

但是,我不会说这个算法是O(N ^ 2),而是 O(S * N ^ 2)。的确,等于的作用是什么?比较字符直到字符不同。在N很小但字符串太长的情况下,您会发现考虑到这一点非常重要。

注意:您可以阅读此interesting thread有关String.equals()的复杂性。如果比较预先计算的长度或哈希码,它显然可以比O(S)快,但这些是内部优化,最坏的情况仍然是O(S)。

答案 1 :(得分:1)

这篇文章中关于单维数组的解释相​​当不错。 https://justin.abrah.ms/computer-science/how-to-calculate-big-o.html

在这篇文章中,他谈到了二维数组: https://justin.abrah.ms/computer-science/big-o-notation-explained.html 在他关于二维数组的大O的解释中有一个经线链接。