在有人问之前,是的,这是以前的测试问题,我错了,知道我错了,因为老实说,我不了解增长功能和大O.我已经阅读了技术定义,我知道它们是什么,但不是如何计算它们。我的教科书给出了现实生活中的例子,但我仍然觉得很难解释代码。如果有人能告诉我他们如何确定这些问题的思考过程,那将会非常有帮助。 (即这部分代码告诉我将n乘以x等,等等。)
public static int sort(int lowI, int highI, int nums[]) {
int i = lowI;
int j = highI;
int pivot = nums[lowI +(highI-lowI)/2];
int counter = 0;
while (i <= j) {
while (nums[i] < pivot) {
i++;
counter++;
}
while (nums[j] > pivot) {
j--;
counter++;
}
count++;
if (i <= j) {
NumSwap(i, j, nums); //saves i to temp and makes i = j, j = temp
i++;
j--;
}
}
if(lowI< j)
{
return counter + sort(lowI, j, nums);
}
if(i < highI)
{
return counter + sort(i, highI, nums);
}
return counter;
}
答案 0 :(得分:0)
阅读some explanations of Big-O可能对您有所帮助。我认为Big-O是随着“输入大小”增加而计算的“基本操作”的数量。对于排序算法,“基本操作”通常意味着比较(或counter
增量,在您的情况下),“输入大小”是要排序的列表的大小。
当我分析运行时时,我会从精神上将代码划分为开始。我忽略了一次性行(如int i = lowI;
),因为它们只运行一次,而Big-O并不关心常量(但请注意,int i = lowI;
运行一次每次递归,所以它不仅整体运行一次)。
例如,我精神上将你的代码分成三个部分进行分析:主循环while (i <= j)
,其中的两个while循环,以及最后的两个递归调用。这些循环将运行多少次迭代,具体取决于i
和j
的值?函数递归多少次,具体取决于列表的大小?
如果我无法同时考虑所有这些不同的部分,我会隔离它们。例如,一个内部for循环运行多长时间,具体取决于i
和j
的值?然后,外部while循环运行多长时间?
一旦我考虑了每个部分的运行时间,我就将它们重新组合在一起。在这个阶段,重要的是要考虑不同部分之间的关系。 “嵌套”关系(即嵌套块每次外部循环一次时循环多次)通常意味着运行时间成倍增加。例如,由于内部while循环嵌套在外部while循环中,因此迭代总数为(inner run time
+ other inner
)* outer
。似乎总运行时间看起来像这样 - ((inner
+ other inner
)* outer
)* recursions
- 也是。