确定增长功能和大O.

时间:2016-04-20 18:00:07

标签: time-complexity big-o

在有人问之前,是的,这是以前的测试问题,我错了,知道我错了,因为老实说,我不了解增长功能和大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;

    }

1 个答案:

答案 0 :(得分:0)

阅读some explanations of Big-O可能对您有所帮助。我认为Big-O是随着“输入大小”增加而计算的“基本操作”的数量。对于排序算法,“基本操作”通常意味着比较(或counter增量,在您的情况下),“输入大小”是要排序的列表的大小。

当我分析运行时时,我会从精神上将代码划分为开始。我忽略了一次性行(如int i = lowI;),因为它们只运行一次,而Big-O并不关心常量(但请注意,int i = lowI;运行一次每次递归,所以它不仅整体运行一次)。

例如,我精神上将你的代码分成三个部分进行分析:主循环while (i <= j),其中的两个while循环,以及最后的两个递归调用。这些循环将运行多少次迭代,具体取决于ij的值?函数递归多少次,具体取决于列表的大小?

如果我无法同时考虑所有这些不同的部分,我会隔离它们。例如,一个内部for循环运行多长时间,具体取决于ij的值?然后,外部while循环运行多长时间?

一旦我考虑了每个部分的运行时间,我就将它们重新组合在一起。在这个阶段,重要的是要考虑不同部分之间的关​​系。 “嵌套”关系(即嵌套块每次外部循环一次时循环多次)通常意味着运行时间成倍增加。例如,由于内部while循环嵌套在外部while循环中,因此迭代总数为(inner run time + other inner)* outer。似乎总运行时间看起来像这样 - ((inner + other inner)* outer)* recursions - 也是。