使用嵌套的If语句/方法调用分析Big-Oh表示法

时间:2015-10-04 01:35:15

标签: java performance if-statement methods big-o

我在完全掌握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;大哦先获得成倍增加?

感谢您提供任何帮助/指示!

1 个答案:

答案 0 :(得分:0)

绘制代码的流程图,尤其是if分支和循环。这有很大帮助。或者,在代码上绘制适当的流线。

在这种情况下,函数复杂性会被添加,而不是相乘,因为它们以线性顺序出现。正如你在“5000 *”中使用的那样,循环是繁殖的。

因此,循环的复杂度为5000 *(O(log n)+ O(n))。这简单地减少到O(n),因为5000,1000和其他杂项都是标量常数。如果“5000”来自其他一些put参数(你可能会称之为“m”),那么算法就是O(m * n)。

到目前为止,这对你有多大意义?