堆的算法时间复杂度

时间:2017-03-18 17:48:34

标签: algorithm data-structures time-complexity permutation

任何人都可以告诉我维基百科,https://en.wikipedia.org/wiki/Heap%27s_algorithm中显示的这个Heap算法的时间复杂度究竟是什么?

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

谢谢。

2 个答案:

答案 0 :(得分:5)

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

这些事实可以从维基百科页面上提供的递归算法得出。本质上,代码交替交换和输出,因此每个输出都涉及单个交换。

但是,还有呼叫操作和循环测试。每次调用之前都有一个循环测试,因此只需要计算呼叫总数。

在最坏的情况下,在输出之前会有 n 递归调用。但这只发生一次,在算法的最开始。带参数 n 的单个调用会产生 n !输出。它通过 n 递归调用来实现,每个调用产生( n -1)!输出,并执行( n -1)递归调用,因此有 n n -1)调用参数 n < / EM> -2。依此类推,总共有1 + n + n n -1)+ n n -1)( n -2)+ ... + n !调用。

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

答案 1 :(得分:3)

我认为你在Heap的算法和堆栈算法或堆数据结构之间混淆。后两者的排序有O(NlogN)复杂度。

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