【问题标题】:Analyzing Big-Oh Notation with nested If statements/method calls使用嵌套的 If 语句/方法调用分析 Big-Oh 表示法
【发布时间】:2015-10-04 01:35:14
【问题描述】:

我在完全掌握 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 * 循环体),但是由于我调用了两个不同的方法,所以这些方法的 big oh 会先相乘吗?

感谢您的任何帮助/指点!

【问题讨论】:

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


    【解决方案1】:

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

    在这种情况下,函数复杂性是相加的,而不是相乘的,因为它们以线性顺序发生。正如您在“5000*”使用中已经指出的那样,循环就是乘法器。

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

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

    【讨论】:

    • 我认为所有这些实际上都是有道理的。 5000*(身体的大 o,在这种情况下是方法)。不过,我不是 100% 的最后一部分。我对 5000 进行了硬编码,因为我用它来循环遍历 2d 数组的 5000 列。那么在那种情况下还会是 O(n) 吗?
    • 如果这是一个 nm 数组,那么这个算法的 O(nm)。如果数组总是不超过 5000 宽,那么它是 O(n)。该算法是否适用于任何宽度(即“m”)的数组?
    • 好的,那就这样吧!所以我想从理论上讲,最好的办法是消除线性搜索并修改二进制搜索以完成相同的工作,因为 O(n) 优于 O(log n)。对吗?
    猜你喜欢
    • 2022-09-23
    • 2020-02-28
    • 1970-01-01
    • 2015-12-14
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多