如何计算此算法的Big O?

时间:2016-03-06 04:45:37

标签: java algorithm big-o function-calls

我想找到method1的Big O。

public static void method1(int[] array, int n)
{
    for (int index = 0; index < n - 1; index++)
    {
        int mark = privateMethod1(array, index, n - 1);
        int temp = array[index];
        array[index] = array[mark];
        array[mark] = temp;
    } // end for
} // end method1

public static int privateMethod1(int[] array, int first, int last)
{
    int min = array[first];
    int indexOfMin = first;
    for (int index = first + 1; index <= last; index++)
    {
        if (array[index] < min)
        {
            min = array[index];
            indexOfMin = index;
        } // end if
    } // end for
    return indexOfMin;
} // end privateMethod1

我的想法是我们不需要关心privateMethod1,这是真的吗?在计算Big O时我们是否不必担心函数调用,只考虑其他因素,比如我们方法1中的赋值操作?

感谢。

2 个答案:

答案 0 :(得分:1)

  

我的想法是我们不需要关心privateMethod1,这是真的吗?

不,你错了。在计算复杂性时,您需要关心其他函数调用。 privateMethod1O(n)时间内运行,因为在最坏的情况下,fist0last始终为n - 1。因此,您的整体循环,即method1O(n ^ 2)时间内运行。

答案 1 :(得分:1)

在分析算法的运行时间时,只有在恒定时间内运行的操作O(1)才能被视为基本操作;在这种特定情况下,为您找到算法的上渐近界(Big-O表示法)。方法for的{​​{1}}循环中的迭代次数取决于privateMethod1中的index(本身取决于method1)以及n 1}},并且显然不会在恒定时间内运行。

因此,我们需要在您的算法的Big-O分析中包含n。我们会将所有其他操作(例如赋值和privateMethod1语句)视为基本操作。

  

在我们的分析中作为基本操作处理:

if

清除后,您可以使用Sigma表示法分析算法:外部总和描述/* in 'method1' */ int temp = array[index]; array[index] = array[mark]; array[mark] = temp; /* in 'privateMethod1' */ int min = array[first]; int indexOfMin = first; //... if (array[index] < min) { min = array[index]; indexOfMin = index; } 中的for循环,内部循环描述method1循环中的for循环1}},privateMethod1概括了内部1循环中所有基本操作的“成本”。

enter image description here

因此,算法for的上渐近界限为method1