我在完全掌握Big-Oh表示法时遇到了一些麻烦,当我看到If语句的一些答案时,我在if / else语句中没有看到任何方法调用。我在下面发布相关代码,线性和二进制搜索是标准实现(我本可以使用Arrays类,但我自己选择练习编码)。精确和一般的Big Oh表示法都会有所帮助。我在下面尝试过。
public static int count(int[][] myArray, int query)
{
queryHits = 0; -----> O(1)
queryNumber++; -----> O(1)
int subArraymin; -----> O(1)
int subArraymax; ----> O(1)
int foundIndex = -1; -> O(1)
int j = 5000; -----> O(1)
for (int i = 0; i<5000; i++) ------------>O(5000 * O(?)
{
subArraymin = myArray[0][j]; -------> O(1)
subArraymax = myArray[999][j]; ------> O(1)
if (query >= subArraymin && query <= subArraymax) ----> O(1?)
{
foundIndex = binarySearch(myArray,0 , 1000, query, j); -->O(5000?) * O(log n)
if (foundIndex == -1) --> O(1?)
{
//irrelevant code omitted
}
else
{
linearSearch(myArray, query, foundIndex, j); -----> O(5000?) * O(n)
}
}
else //irrelevant code omitted
}
return queryHits;
}
我的主要问题:
1.我的if语句是O(1)还是O(n)?
2.我相信我的for循环是O(5000 *循环体)但是因为我调用了两种不同的方法,所以做那些方法&#39;大哦先获得成倍增加?
感谢您提供任何帮助/指示!
答案 0 :(得分:0)
绘制代码的流程图,尤其是if分支和循环。这有很大帮助。或者,在代码上绘制适当的流线。
在这种情况下,函数复杂性会被添加,而不是相乘,因为它们以线性顺序出现。正如你在“5000 *”中使用的那样,循环是繁殖的。
因此,循环的复杂度为5000 *(O(log n)+ O(n))。这简单地减少到O(n),因为5000,1000和其他杂项都是标量常数。如果“5000”来自其他一些put参数(你可能会称之为“m”),那么算法就是O(m * n)。
到目前为止,这对你有多大意义?