堆的算法时间复杂度

Posted

技术标签:

【中文标题】堆的算法时间复杂度【英文标题】:Heap's algorithm time complexity 【发布时间】:2020-03-27 16:34:18 【问题描述】:

谁能告诉我***https://en.wikipedia.org/wiki/Heap%27s_algorithm中显示的这个堆算法的时间复杂度到底是多少?

我搜索了几个网站,答案都很模糊,有些人说时间复杂度是 O(N!),有些人说是 O(NlogN)。哪一个是正确答案?为什么?

谢谢。

【问题讨论】:

【参考方案1】:

N 个!全部排列并生成所有排列需要 Θ(N!) 时间和 Θ(N) 空间。换句话说,每个排列都需要摊销的 Θ(1) 时间。

这些事实可以从***页面上提供的递归算法推导出来。本质上,代码交替交换和输出,因此每个输出都涉及一个交换。

但是,也有调用操作和循环测试。每次调用前都有一次循环测试,所以只需要统计调用的总数。

在最坏的情况下,在输出之前会有 n 个递归调用。但这只会发生一次,在算法的最开始。带有参数 n 的单个调用会产生 n!输出。它通过 n 个递归调用来做到这一点,每个递归调用都会产生 (n-1)!输出,并执行 (n-1) 次递归调用,因此有 n(n-1) 个参数调用 n-2。以此类推,所以一共有1 + n + n(n-1) + n (n-1)(n-2) + ... + n!来电。

可以写成Σ0≤i≤nn!/i!或 (Σ0≤i≤n1/i!)n!或者 (e-1),大约是 1.71828 n

【讨论】:

感谢您的清晰解释。但是我能知道为什么会出现这个算法吗?这种算法是否比其他方法更好地找到所有可能的排列,或者它只是另一种探索的新方法?谢谢。 @USER1223_T:我认为***页面上对此进行了解释。 (“算法使运动最小化。”)我怀疑想出它的人只是觉得它很酷;那是50多年前的事了,所以我不知道我们是否会得到答案。我认为这是一个很酷的算法,就其价值而言。【参考方案2】:

我认为您在堆算法和堆排序算法或堆数据结构之间感到困惑。后两者的排序复杂度为 O(NlogN)。

您提到的算法是用于生成所有排列,因为有 N!每个 N 元素数组的排列,复杂度是 O(N!)。

【讨论】:

我明白了,谢谢你的解释。但是他们为什么要开发这种算法来查找所有排列,因为时间复杂度仍然是 O(N!)?如果与其他算法相比,此算法是否更有效(查找所有其他排列的正常方法)?

以上是关于堆的算法时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

排序算法 -- 堆排序

数据结构:堆 的详解

堆的实现---增,删,查,改,堆排序,TopK问题(自用)

重温基础算法内部排序之堆排序法

重温基础算法内部排序之堆排序法

数据结构-堆的概念及实现