如何找到这个函数的大O
How to find big O of this function
所以我有这个函数可以遍历 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;
}
}
}
}
你几乎是对的。但是要小心,大 O 表示法可能会很棘手,即使当你有条理时它并不那么复杂。
让我们总结一下您的代码的作用:您收到一个大小为 NxN 的二维数组和一个长度为 S 的字符串,并尝试在矩阵中找到该字符串(一次或多次)。即使您 break 循环有时,也只是假设它不会发生那么多。然后,您只需遍历该矩阵的元素并比较每个元素的两个字符串。
基本上,如果你说这个算法是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)。
这个post对一维数组的解释还是不错的。 https://justin.abrah.ms/computer-science/how-to-calculate-big-o.html
在这个 post 中,他谈到了二维数组:
https://justin.abrah.ms/computer-science/big-o-notation-explained.html
他对二维数组的big-O的解释中有一个coursera link。
所以我有这个函数可以遍历 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;
}
}
}
}
你几乎是对的。但是要小心,大 O 表示法可能会很棘手,即使当你有条理时它并不那么复杂。
让我们总结一下您的代码的作用:您收到一个大小为 NxN 的二维数组和一个长度为 S 的字符串,并尝试在矩阵中找到该字符串(一次或多次)。即使您 break 循环有时,也只是假设它不会发生那么多。然后,您只需遍历该矩阵的元素并比较每个元素的两个字符串。
基本上,如果你说这个算法是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)。
这个post对一维数组的解释还是不错的。 https://justin.abrah.ms/computer-science/how-to-calculate-big-o.html
在这个 post 中,他谈到了二维数组: https://justin.abrah.ms/computer-science/big-o-notation-explained.html 他对二维数组的big-O的解释中有一个coursera link。