使用嵌套的 If statements/method 调用分析 Big-Oh 表示法
Analyzing Big-Oh Notation with nested If statements/method calls
我在完全掌握 Big-Oh 表示法时遇到了一些麻烦,虽然我看到了 If 语句的一些答案,但我没有看到 if/else 语句中的任何方法调用。我在下面发布相关代码,线性和二进制搜索是标准实现(我本可以使用数组 class 但选择自己练习编码)。精确和一般的 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 * 循环体) 但由于我调用了两种不同的方法,那些方法的大哦首先得到乘法吗?
感谢您的任何 help/pointers!
画出代码流程图,尤其是if分支和循环。这很有帮助。或者,在您的代码上绘制适当的流程线。
在这种情况下,函数的复杂性得到增加,而不是增加,因为它们以线性顺序出现。正如您在“5000*”中所指出的那样,循环就是乘法。
因此,循环的复杂度为 5000*(O(log n) + O(n))。这简化为 O(n),因为 5000、1000 和其他杂项都是标量常数。如果“5000”来自其他一些输入参数(您可能称之为 "m"),则算法为 O(m*n).
到目前为止,您觉得其中有多少意义?
我在完全掌握 Big-Oh 表示法时遇到了一些麻烦,虽然我看到了 If 语句的一些答案,但我没有看到 if/else 语句中的任何方法调用。我在下面发布相关代码,线性和二进制搜索是标准实现(我本可以使用数组 class 但选择自己练习编码)。精确和一般的 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 * 循环体) 但由于我调用了两种不同的方法,那些方法的大哦首先得到乘法吗?
感谢您的任何 help/pointers!
画出代码流程图,尤其是if分支和循环。这很有帮助。或者,在您的代码上绘制适当的流程线。
在这种情况下,函数的复杂性得到增加,而不是增加,因为它们以线性顺序出现。正如您在“5000*”中所指出的那样,循环就是乘法。
因此,循环的复杂度为 5000*(O(log n) + O(n))。这简化为 O(n),因为 5000、1000 和其他杂项都是标量常数。如果“5000”来自其他一些输入参数(您可能称之为 "m"),则算法为 O(m*n).
到目前为止,您觉得其中有多少意义?