当前位置: 首页 > 知识库问答 >
问题:

堆中已降序排序数组的时间复杂度

慕佑运
2023-03-14

考虑一个已经按降序排序的数组A[n]。堆已经生成。现在考虑一下我们将[1](数组索引从1开始)与[heap.size]交换的循环。以下是伪代码:

Build-Max-Heap(A) //Already done
while (i > 0) {

     swap(A[1] with A[heap_size]
     heap_size = heap_size - 1
     Max-Heapify(A,1) //Takes lg(A.heap_size) time to float the 1st element down to it's respective position

} 

我们在元素1上调用Max-Heapify以通过允许它向下浮动到适当的位置来恢复堆属性。我们知道Max-Heapify将花费clg(n)时间。那么,循环不是应该花费c(lg(n)lg(n-1)... lg(1))=Theta(log(n))时间而不是jutθ(n*lg(n))吗?因为堆大小随着每次迭代而减小?

共有1个答案

堵琨
2023-03-14

n的对数之和。。1不是log(n),而是nlogn(看看斯特林公式)

从任意数组构建的经典堆是O(n)进程-而不是O(nlogn)

 类似资料:
  • 下面是数组上HEAPSORT的伪代码 很明显,BUILD-MAX-HEAP的复杂度为O(n),MAX-HEAPIFY的复杂度为O(h),其中h是具有最大logn值的堆的高度。 我不完全理解的是为什么HeapSort有nlogn的复杂性。我知道我们有n次迭代,每次迭代都有一个MAX-HEAPIFY。但是他MAX-HEAPIFY调用在每次迭代中都得到一个大小递减的HEAP。那么为什么每次迭代都有O(l

  • 问题: 我必须分析时间复杂度来对几乎已排序的整数值列表进行排序(使用快速排序)。 我做了什么? 我读过SO Q1、SO Q2、SO Q3和这一本。 但是,我没有发现任何明确提到使用快速排序对k排序数组进行排序的时间复杂度的内容。 由于快速排序算法的时间复杂度取决于选择数据透视的策略,并且由于几乎排序了数据,因此有可能面临最坏情况,为了避免最坏情况,我使用了三个值(第一、中间、最后)的中位数作为这里

  • 帮助我减少这个程序的时间复杂性 输出:为每个测试用例输出这样的对的数量。 约束条件:T≤10;N≤100000;A[i]≤1000000 示例输入(明文链接)

  • 问题内容: 有没有什么简便的方法可以按降序对数组进行排序,就像它们在Arrays类中如何按升序排序? 问题答案: 你可以使用它对所有对象进行排序 不能直接用于降序对原始数组进行排序。如果尝试Arrays.sort()通过传递由定义的反向 来调用该方法,则会抛出错误 找不到适合sort(int [],comparator)的方法 可以与“对象数组”(例如整数数组)一起使用,但不能与基本数组(例如整数

  • 在这种情况下,复杂度不应该像O(n)=n*[(n-1)(n-2)......(n-(n-1))]那样,对于外环的n次中的每一次,内环运行的差分步长逐渐减小由一。这样O(n)就等于(n^3-n^2)/2。我的方法有什么问题?

  • 我有一个关于计算时间复杂度的非常普遍的问题(大O符号)。当人们说QuickSort最差的时间复杂度是O(n^2)(每次都选择数组的第一个元素作为轴心,并且数组是反向排序的)时,他们考虑了哪个操作来获得O(n^2)?人们会计算if/else语句所做的比较吗?或者他们只计算其进行的互换的总数?一般来说,你如何知道计算大O符号需要计算哪些“步骤”。 我知道这是一个非常基本的问题,但我已经阅读了谷歌上几乎