确定生长函数和 Big O
Determining growth function and Big O
在有人问之前,是的,这是以前的测试题我做错了并且知道我做错了因为老实说我只是不理解增长函数和 Big 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;
}
阅读some explanations of Big-O可能对您有所帮助。我认为 Big-O 是随着 "input size" 的增加而计算出的 "basic operations" 的数量。对于排序算法,"basic operations" 通常表示比较(或 counter
递增,在您的情况下),"input size" 是要排序的列表的大小。
当我分析 运行 时间时,我将首先在心理上将代码分成多个部分。我忽略了一次性行(如 int i = lowI;
),因为它们只有 运行 一次,而 Big-O 不关心常量(不过,请注意你的情况 int i = lowI;
运行每次递归一次,所以它不仅是运行一次。
例如,我会在心理上将您的代码整体分为三个部分进行分析:主要的 while 循环 while (i <= j)
、其中的两个 while 循环以及末尾的两个递归调用。根据 i
和 j
的值,这些循环 运行 将进行多少次迭代?函数将递归多少次,具体取决于列表的大小?
如果我无法同时考虑所有这些不同的部分,我会将它们分开。例如,根据 i
和 j
的值,内部 for 循环 运行 会持续多长时间?那么,外层while循环运行要多长时间?
一旦我想好了每个部分的运行时间,我就会把它们重新组合起来。在此阶段,重要的是要考虑不同部分之间的关系。 "Nested" 关系(即嵌套块循环多次,每次外部事物循环一次)通常意味着 运行 次相乘。例如,由于内部 while 循环嵌套在外部 while 循环中,因此迭代总数为 (inner run time
+ other inner
) * outer
。似乎总 运行 时间看起来像这样 - ((inner
+ other inner
) * outer
) * recursions
- 也是。
在有人问之前,是的,这是以前的测试题我做错了并且知道我做错了因为老实说我只是不理解增长函数和 Big 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;
}
阅读some explanations of Big-O可能对您有所帮助。我认为 Big-O 是随着 "input size" 的增加而计算出的 "basic operations" 的数量。对于排序算法,"basic operations" 通常表示比较(或 counter
递增,在您的情况下),"input size" 是要排序的列表的大小。
当我分析 运行 时间时,我将首先在心理上将代码分成多个部分。我忽略了一次性行(如 int i = lowI;
),因为它们只有 运行 一次,而 Big-O 不关心常量(不过,请注意你的情况 int i = lowI;
运行每次递归一次,所以它不仅是运行一次。
例如,我会在心理上将您的代码整体分为三个部分进行分析:主要的 while 循环 while (i <= j)
、其中的两个 while 循环以及末尾的两个递归调用。根据 i
和 j
的值,这些循环 运行 将进行多少次迭代?函数将递归多少次,具体取决于列表的大小?
如果我无法同时考虑所有这些不同的部分,我会将它们分开。例如,根据 i
和 j
的值,内部 for 循环 运行 会持续多长时间?那么,外层while循环运行要多长时间?
一旦我想好了每个部分的运行时间,我就会把它们重新组合起来。在此阶段,重要的是要考虑不同部分之间的关系。 "Nested" 关系(即嵌套块循环多次,每次外部事物循环一次)通常意味着 运行 次相乘。例如,由于内部 while 循环嵌套在外部 while 循环中,因此迭代总数为 (inner run time
+ other inner
) * outer
。似乎总 运行 时间看起来像这样 - ((inner
+ other inner
) * outer
) * recursions
- 也是。