任何人都可以告诉我维基百科,https://en.wikipedia.org/wiki/Heap%27s_algorithm中显示的这个Heap算法的时间复杂度究竟是什么?
我搜索了几个网站,答案都很模糊,有些人说时间复杂度是O(N!),有些人说是O(NlogN)。哪一个是正确的答案?为什么?
谢谢。
答案 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!)。