【问题标题】:How to find big O of this function如何找到这个函数的大 O
【发布时间】:2015-10-18 10:26:56
【问题描述】:

所以我有这个函数在 Java 中迭代一个 8x8 多维数组。我试图在 findTheBoss() 中理解这个函数的大 O。它在静态 8x8 网格中搜索给定的字符串。我真的很想了解如何找到诸如此类的基本功能的大 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;
            }
        }

    }   

}

【问题讨论】:

  • 了解outer loop 运行了多少次,对于每个outer loop iteration,了解inner loop 运行了多少次。顺便说一句,您的答案是正确的,但我会留给您分析为什么
  • 外循环运行,但是长 n 是正确的,所以外循环是 n。但是内部的运行但是许多总项目在多维数组内。那会是n^2吗?如果它不是一个完美的正方形怎么办,它会是n^2吗?

标签: java loops big-o concept


【解决方案1】:

你几乎是对的。但要小心,大 O 表示法可能会很棘手,即使当你有条不紊时它并不复杂。

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

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

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


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

【讨论】:

  • 我明白了。谢谢,我真的很着迷于能够计算我的算法的功能。我没有考虑字符串的长度。没错,如果某些对象是 200 个字符的字符串,那么这会妨碍算法的性能。
  • 不客气。通常有两种方法可以找到复杂性。最好在开始时尝试两者。我通过思考这个概念来提出我的解决方案:你的程序是做什么的?另一种解决方案是检查代码并考虑循环和每一行代码的成本。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2019-03-22
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多