- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解不同数据结构的时间复杂度,并从堆排序开始。根据我的阅读,我认为人们共同同意堆排序的时间复杂度为 O(nlogn);但是,我很难理解这是怎么回事。
大多数人似乎同意 heapify 方法采用 O(logn),而 buildmaxheap 方法采用 O(n) 因此 O(nlogn),但为什么 heapify 采用 O(logn)?
从我的角度来看,heapify 似乎只是一种比较节点的左右节点并根据它是最小堆还是最大堆来正确交换它们的方法。为什么需要 O(logn)?
我想我在这里遗漏了一些东西,如果有人能向我更好地解释这一点,我将不胜感激。
谢谢。
最佳答案
您似乎对堆排序的时间复杂度感到困惑。确实,从未排序的数组构建最大堆需要 O(n) 时间和 O(1) 来弹出一个元素。但是,从堆中弹出顶部元素后,您需要将堆中的最后一个元素 (A) 移动到顶部和 heapy 以维护堆属性。对于元素 A,它最多弹出 log(n) 次,这是堆的高度。因此,在弹出最大值后,最多需要 log(n) 次时间来获取下一个最大值。下面是堆排序过程的一个例子。
18
15 8
7 11 1 2
3 6 4 9
弹出18的数字后,需要把数字9放在最上面堆化9。
9
15 8
7 11 1 2
3 6 4
我们需要弹出 9 因为 9 < 15
15
9 8
7 11 1 2
3 6 4
我们需要弹出 9 因为 9 < 11
15
11 8
7 9 1 2
3 6 4
9 > 4 这意味着 heapify 过程已经完成。现在您可以在不破坏堆属性的情况下安全地获得下一个最大值 15。
对于执行堆化过程所需的每个数字,您都有 n 个数字。所以heapsort的时间复杂度是O(nlogn)
关于time-complexity - 为什么堆排序的时间复杂度是O(nlogn)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54078858/
直觉上,我认为这三个表达式是等价的。 例如,如果一个算法在 O(nlogn) + O(n) 或 O(nlogn + n) 中运行(我很困惑),我可以假设这是一个O(nlogn) 算法? 什么是真相?
假设我有一个长度为 n 的数组,我使用时间为 nlogn 的排序算法对它进行了排序。得到这个排序后的数组后,我遍历它以找到任何具有线性时间的重复元素。我的理解是,由于操作是分开发生的,所以时间是 O(
我有 2 个 int 数组,我需要在 O(nlogn) 中打印所有相同的整数数组未排序,排序后可以是: X [ 1,2,3,4,5,6,7,8,9] Y [1,2,8,9] 所以只检查到第 4 个位置
我理解了合并排序的概念。但我很难分析合并排序的时间复杂度。我知道对于所有情况,即最坏情况、平均情况和最好情况,它都是 o(n log n) 。但我无法理解它是如何o(n log n) 的。在每次迭代中
给定两个已排序的整数数组 A1、A2,具有相同的长度 n 和一个整数 x,我需要编写一个算法在 O(nlog(n)) 中运行,确定是否存在两个元素 a1, a2(每个数组中的一个元素)使 a1+a2=
我正忙着准备考试,只是在做一些旧的试卷。下面的问题是我似乎唯一做不到的问题(我真的不知道从哪里开始)。任何帮助将不胜感激。 使用 Ω(nlogn) 比较排序边界、theta(n) 边界用于自下而上的堆
我正在阅读一本关于算法分析的书,发现了一个我不知道如何获得时间复杂度的算法,尽管书上说它是 O(nlogn)。 算法如下: sum1=0; for(k=1; k<=n; k*=2) for(j=1
我现在正在阅读 Cracking the Coding Interview 一书,并且正在做一个二叉树练习。根据 O(NlogN) 一书,有一段代码,但是,我不明白为什么会这样。我能理解算法是否为 O
假设我有一个空间要求为 nlogn 的函数,我想计算出该函数在给定可用空间下的最大输入大小。即我想在 nlogn=c 处找到 n。 我关注了an approach计算 n,在 R 中看起来像这样: s
我试图了解不同数据结构的时间复杂度,并从堆排序开始。根据我的阅读,我认为人们共同同意堆排序的时间复杂度为 O(nlogn);但是,我很难理解这是怎么回事。 大多数人似乎同意 heapify 方法采用
我得到了字符串哈希值数组,例如:“123-51s-12as-dasd1-das-41c-sadasdgt-31”。我需要找出是否有重复的内容。问题是,我需要在 O(nlogn) 时间内找到它们。 1)
我今天有一个实习面试,我无法弄清楚。 total = 0 product(int array[]) { if (array.length == 1) { return arra
该函数使用 int 列表并按递增顺序生成列表中的唯一元素。例如: singles([4,1,4,17,1]) => [1,4,17] 我只能在O(n^2)的运行时间内完成,想知道如何在不循环的
给定一个整数数组,返回一个新数组,其中每个元素新数组是其右侧较小元素的数量原始输入数组中的元素。例如,给定数组 [3, 4, 9, 6, 1],返回 [1, 1, 2, 1, 0]。 import b
我想找出数组中两个数字之间的最大差值,被减数必须在减法器之前。例如:在一个数组(3,1,5,4,2)中,最大差应该是3(5-2)。在数组(100, 3 ,200)中,最大差应该是97(100-3)。
我正在尝试解决所附图片中显示的问题。我得到了划分部分,您可以在其中递归地将线集分成两半,并且可以看到具有最小和最大斜率的线。 虽然我不知道如何进行合并部分,但我也不理解。 凭直觉,起初,我认为如果没有
在这本在线教科书中https://runestone.academy/runestone/static/pythonds/SortSearch/TheMergeSort.html他们为合并排序提供了以
我们最近在学习中接到任务,用主定理解决递归函数的复杂性。我知道这些问题在这里被问了很多,但我无法从这些问题中找出这个问题的答案。特别是一个问题很好地描述了问题:here 我的问题是递归函数 T(n)
问题陈述:目标是在 nlogn 时间内找到最长的递增子序列(不连续)。 算法:我理解这里解释的算法: http://www.geeksforgeeks.org/longest-monotonicall
我知道这里有很多与我的问题相关的问题,但我仍然感到困惑。我对计算几何有点陌生,任何建议都会有所帮助。 问题:一组n矩形,其边平行于x轴或y轴,并且每个矩形的长度和高度都相同;已知每个矩形的四个角点的坐
我是一名优秀的程序员,十分优秀!