【问题标题】:Time complexity for a recursion inside for loop javafor循环java中递归的时间复杂度
【发布时间】:2015-05-03 14:23:20
【问题描述】:

您好,我遇到了这个问题。我尝试在几个堆栈溢出帖子、google 和 youtube 的帮助下解决这个问题三天,但我无法解决这个问题。

我的问题是。我如何得到 T(N) = ?对于烫发(1)。我猜它在某种程度上是 O(n^2) 甚至更糟,因为以下原因。我的 for 循环取决于一个变量 n,而我的内部递归需要 n+1,所以这将是 n*(n+1) ~ n^2。但是我如何通过这个程序并证明这一点?我知道我可以忽略所有常数因素,如加法等,但如果有人花时间解释代码中的每一个时间单位成本并将其总结起来直到我们有一个递归方程,我会很好。

为了获得每一个排列,我们将 perm(1) 更改为 perm(0)。 1) 如果我们排列 n 个数,我们有多少次调用 2) 如果 n 变得非常大,则单个排列平均会省略多少调用。

解释。我们给这个程序 n 个数来置换。如果我们也想置换 0,我们调用 perm(0),否则我们调用 perm(1)。

private void perm(int i) { // permute from index i; 1 or 0(all permuts).
    if (i >= max) put();  // one permutation finished, max = n-1
    else {
        for (int j = i; j <= max; j++) { // everyone in front
            swap(i, j);               // swap
            perm(i + 1);               // and recursion
        }
        int h = a[i];                 // restore Array
        System.arraycopy(a, i + 1, a, i, max - i); // shift left
        a[max] = h;
    }
} // end perm

private void swap(int i, int j) {   // swap a[i] <-> a[j]
    if (i != j) {
        int h = a[i];
        a[i] = a[j];
        a[j] = h;
    }
} // end swap

private synchronized void put() {   // give over to array
    mayread = true;                 // read a (array)
    notify();                      // notify the other Thread
    try {
        if (a != null)
            while (mayread) wait();    // non busy waiting
    } catch (InterruptedException e) {
    }
} // end put

还有我的最后一个问题。当我们在 for 循环中并调用 swap(1,1),如 j=i 或 swap(2,2) 之后会发生什么,然后是递归。

【问题讨论】:

    标签: java algorithm time-complexity permutation


    【解决方案1】:

    swap 是 O(1)。

    perm 执行max-i+1 迭代的循环,然后在每次迭代中执行perm(i+1)。然后,毕竟,它对max-i 项进行了数组复制。

    让我们将max 称为n。

    • perm(1) 执行循环 n 次
    • perm(2) 执行循环 n-1 次
    • perm(3) 执行循环 n-2 次

    等等……

    这会导致n*(n-1)*(n-2)*...*1 迭代。 O(n!)

    另外,swap(1, 1) 什么也不做。

    【讨论】:

    • 谢谢这部分 (n-1)*(n-2)*(n-3) --> O((n-1)!) 对我来说是新的,我会用谷歌搜索现在,但这听起来像我需要的。谢谢你的解释,我知道 swap(1,1) 什么都不做,只是什么时候做某事。我们如何到达交换(2,1)或交换(1,2)。谢谢
    • @MatthisKohli 你是什么意思? swap(2, 1) 永远不会发生,因为 j&gt;=i 永远不会发生。但是swap(1, 2) 将交换数组a 的位置1 和2 的值。另外,请注意我修正了我的答案,它是 O(n!)。我没有考虑 for 循环中的&lt;=。
    • 我的意思是:算法如何交换值。它从 i=1 开始并设置 j=i,所以 swap(1,1) 什么也不做,然后我们调用递归,对于 perm(i+1) 也是如此,所以 i = 2 和 j = i,所以交换(2,2)我们再次调用递归perm(i + 1),所以i = 3和j = i,所以swap(3,3)什么都没有,如果我们的N是5,我们称之为perm(i + 1) ,所以 i = 4 和 j = i 并且 MAX 是 5-1,所以我们有 j
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多