递归字符串排列函数的复杂度

发布于 2024-10-23 18:46:20 字数 560 浏览 1 评论 0原文

来自: 是否有更好的方法来进行字符串排列?

这个函数的复杂度是多少???

void permute(string elems, int mid, int end)
{
    static int count;
    if (mid == end) {
        cout << ++count << " : " << elems << endl;
        return ;
    }
    else {
    for (int i = mid; i <= end; i++) {
            swap(elems, mid, i);
            permute(elems, mid + 1, end);
            swap(elems, mid, i);
        }
    }
}

From: Are there any better methods to do permutation of string?

what is the complexity of this function???

void permute(string elems, int mid, int end)
{
    static int count;
    if (mid == end) {
        cout << ++count << " : " << elems << endl;
        return ;
    }
    else {
    for (int i = mid; i <= end; i++) {
            swap(elems, mid, i);
            permute(elems, mid + 1, end);
            swap(elems, mid, i);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

柏林苍穹下 2024-10-30 18:46:20

忽略打印​​,满足的递推关系是

T(n) = n*T(n-1) + O(n)

If G(n) = T(n)/n! 我们得到

G(n) = G(n-1) + O(1/(n-1)!)

给出G(n) = Theta(1)

因此T(n) = Theta(n!)

假设打印恰好发生 n! 次,我们得到的时间复杂度为

Theta(n * n!)

Ignoring the print, the recurrence relation satisfied is

T(n) = n*T(n-1) + O(n)

If G(n) = T(n)/n! we get

G(n) = G(n-1) + O(1/(n-1)!)

which gives G(n) = Theta(1).

Thus T(n) = Theta(n!).

Assuming that the print happens exactly n! times, we get the time complexity as

Theta(n * n!)

心意如水 2024-10-30 18:46:20

在不深入研究您的代码的情况下,我想我可以有合理的信心地说它的复杂性是 O(n!)。这是因为任何枚举 n 个不同元素的所有排列的有效过程都必须迭代每个排列。有n个!排列,因此算法必须至少为 O(n!)。

编辑:

这实际上是 O(n*n!)。感谢@templatetypedef 指出了这一点。

Without looking too deeply at your code, I think I can say with reasonable confidence that its complexity is O(n!). This is because any efficient procedure to enumerate all permutations of n distinct elements will have to iterate over each permutation. There are n! permutations, so the algorithm has to be at least O(n!).

Edit:

This is actually O(n*n!). Thanks to @templatetypedef for pointing this out.

嘦怹 2024-10-30 18:46:20
long long O(int n)
{
    if (n == 0)
        return 1;
    else 
       return 2 + n * O(n-1);
}

int main()
{
    //do something
    O(end - mid);
}

这将计算算法的复杂度。

实际上 O(N) 是 N!!! = 1 * 3 * 6 * ... * 3N

long long O(int n)
{
    if (n == 0)
        return 1;
    else 
       return 2 + n * O(n-1);
}

int main()
{
    //do something
    O(end - mid);
}

This will calculate complexity of the algorithm.

Actualy O(N) is N!!! = 1 * 3 * 6 * ... * 3N

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文