【问题标题】:Order and Growth Function of Loops循环的顺序和增长函数
【发布时间】:2020-05-30 12:59:08
【问题描述】:

我试图在一个函数中找到这个 for 循环的顺序和增长函数,该函数接受一个长度为 n > 2 的数组。

此函数按升序排列数组。我试图找到最坏情况的顺序:当数组最初按降序排序时,函数因此必须多次遍历数组才能对其进行排序。

这是循环:

        for (int next = 1; next < array.length; next++) {
            int value = array[next];
            int index = next;
            while (index > 0 && value < array[index - 1]) {
                array[index] = array[index - 1];
                index--;
            }
            array[index] = value;
        }

我一直在绞尽脑汁想弄清楚。编写测试,写下大量函数,我接近了,但永远不会正确。你将如何通过这样的循环来找到它的顺序和增长函数?

任何方向都将不胜感激。非常感谢。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    设 n 为数组长度。该循环的最坏情况运行时间为 O(n^2)。看这个的简单方法如下:

    next = 1 时,while 循环执行的操作数最多为 1。next = 2 时,操作数最多为 2,以此类推,直到 next = (n - 1)。我们可以忽略 for 循环完成的其他操作,因为它们构成与增长无关的低阶项。

    所以现在,操作数是 k * (1 + 2 + 3 + 4 + ... + (n - 1)) = k*(n*(n - 1)/2) = kn^2 - kn/2 其中 k 是一个常数因子。

    因此,函数的增长是 n^2 阶的。

    编辑:

    为了解决评论,我们通常不计算 total 语句的数量,因为没有这样做的标准。

    例如,您会将后续循环的一次迭代计为一个语句(单个打印语句)还是两个语句(打印语句和递增 i)?

    for (int i = 0; i < n; i++)
    {
        print(i);
    }
    

    此外,坦率地说,它并不是一个非常有用的指标。在大多数情况下,我们只关心算法的最高阶项。

    但是,为了回答您的问题,我会将循环视为执行以下许多语句: 2n^2 + 2n - 3.

    【讨论】:

    • 好的,我可以看到。我能够确定内部循环迭代了多少次。我发现内循环迭代 $\sum_{j=1}^{n-1}j = \frac{n(n-1)}{2}$ 次,每次 $n-1$ 次外循环迭代。我的问题是找到所有事物的增长函数(执行的语句总数)。你给了一个,看起来,但我想要更具体的东西。
    • 我想出了如下的增长函数,貌似准确:2n^2 + 5n-5
    • 正如我所说,计算确切操作次数的方法没有标准化,但如果您的增长函数与您的计算一致,那就更好了!希望我的回答对你有所帮助!
    • 我明白了。我试图解决特定情况下的增长函数。在这一个中,它是针对“最坏情况”的情况。是的,您的回答确实帮助我改变了一些想法,以便我可以解决它。非常感谢您花时间回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2015-11-17
    • 2019-06-28
    相关资源
    最近更新 更多