我需要使用Master's定理来计算Heap Sort的时间复杂度,但我不知道哪个是递归关系。我知道它的复杂性是O(n log n),因为它遍历了二叉树的n倍。但是我需要专门使用Master的定理,为此我需要递归关系。 Heap Sort的关系是什么?
答案 0 :(得分:1)
让我们从堆积算法开始:
heap_sort(int Arr[])
{
int heap_size = n;
build_maxheap(Arr);
heap_sort_recurse(Arr, heap_size);
}
heap_sort_recurse(int Arr[], heap_size)
{
swap(Arr[1], Arr[n]);
heap_size = heap_size - 1;
heapify(Arr, 1, heap_size);
}
build_maxheap()函数具有O(n)的标准实现。
排序的重要部分是for循环,执行n次。 在里面我们有一个swap方法调用和heapify方法调用。 heapify方法是完整二叉树的标准遍历。因此,复杂性为O(log n)
T(n)= O(n)+ n * O(log n) = O(n * log n)
Master定理对于解决许多分而治之算法的递归关系很有用。
现在,如果您对主定理的应用感兴趣。我们可以实现递归算法
T(n) = aT(n-b) + f(n)
where n > 1, a>0, b>0
在这种情况下,您可能会有一个递推方程式如下
T(n)= T(n-1)+ O(log n)
显然,这不能通过主定理直接解决。 有一个为Subtract-and-Conquer类型派生的修改公式。
此link可能有用。
对于表格的重复,
checkout([$class: 'GitSCM', branches: [[name: '*/wip']],
userRemoteConfigs: [[url: 'ssh://git@5.6.7.8:5999/my/repo.git',
credentialsId: 'your-credentials-id']]])
如果f(n)为O(n k )且k> = 0,那么
应用此,
我们有a = 1,b = 1,k = 0
因此,第二种情况适用。因此,
T(n)= O(n 0 + 1 * log n) = O(n * log n)
希望它有所帮助!