所以我有这个函数在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;
}
}
}
}
答案 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的解释中有一个经线链接。