我想找到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中的赋值操作?
感谢。
答案 0 :(得分:1)
我的想法是我们不需要关心privateMethod1,这是真的吗?
不,你错了。在计算复杂性时,您需要关心其他函数调用。 privateMethod1
在O(n)
时间内运行,因为在最坏的情况下,fist
将0
而last
始终为n - 1
。因此,您的整体循环,即method1
在O(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
循环中所有基本操作的“成本”。
因此,算法for
的上渐近界限为method1
。