chapter_heap/heap/ #242
Replies: 53 comments 69 replies
-
这部分的py我先预定一下。今晚回去更一下 |
Beta Was this translation helpful? Give feedback.
-
"输入数据并建堆"小节中提到“元素入堆的时间复杂度为O(n)”,这里应该是O(logn)吧,“元素入堆”那一小节也提到了这一点(ps.很感谢k神的教程,一路看下来帮助很大(刚刚回复到别人的评论上了不好意思orz |
Beta Was this translation helpful? Give feedback.
-
歪个楼,想请问下堆顶元素出堆的poll()用的是单词的哪个含义呀,有无英语好的大佬解答一下呢。是poll的头顶,顶部;还是轮询,查询 |
Beta Was this translation helpful? Give feedback.
-
heap.java 堆顶元素出堆好像没有名为heap的堆 |
Beta Was this translation helpful? Give feedback.
-
请问一下,堆排序怎么样的,能不能补充一下呢。二叉搜索树排序能明白,但是堆 “依次将所有元素弹出”也不是有序的啊,只是上面的比下面的大,下面的还是保证不了顺序的。能简单说一下吗?谢谢大佬 |
Beta Was this translation helpful? Give feedback.
-
k神,堆初始化的时候,这一段代码没搞明白, |
Beta Was this translation helpful? Give feedback.
-
k神,代码里的注释能不能写的更详细一点,特别是这几节我每次看代码都要理解好久,// 当“越过根节点”或“节点无需修复”时,结束堆化if (p < 0 || maxHeap.get(i) <= maxHeap.get(p)),就像这里p<0,我想了好一会才理解它是根据parent()表示的越过根节点。 |
Beta Was this translation helpful? Give feedback.
-
siftUp(size() - 1); k神,这里的 |
Beta Was this translation helpful? Give feedback.
-
不错,感觉可以和cookbook一起看,labuladong的感觉不适合算法新手完全看不进去 |
Beta Was this translation helpful? Give feedback.
-
堆顶元素出堆 为什么选择操作交换堆顶和最右子节点而不是交换堆顶和最底层最左子节点呢? |
Beta Was this translation helpful? Give feedback.
-
为何没有PHP? |
Beta Was this translation helpful? Give feedback.
-
my_heap.cpp多了行注释// 若节点 i 最大或索引 l, r 越界,则无须继续堆化,跳出 |
Beta Was this translation helpful? Give feedback.
-
不错,跟《Java编程的逻辑》一起看,看看Java的实现,看看大佬的实现,加强印象 |
Beta Was this translation helpful? Give feedback.
-
元素入堆那里,高度为什么要加上时间复杂度啊 |
Beta Was this translation helpful? Give feedback.
-
您这回复效率,实在令人佩服…… |
Beta Was this translation helpful? Give feedback.
-
“从顶至底堆化”的操作方向与“从底至顶堆化”相反,我们将根节点的值与其两个子节点的值进行比较,将最大的子节点与根节点交换 |
Beta Was this translation helpful? Give feedback.
-
8.1.3 堆的常见应用中优先队列部分的“而建队操作为O(n)”是不是拼错了,应该是“建堆”吧? |
Beta Was this translation helpful? Give feedback.
-
maxHeap.add(val)不是已经确保了堆的正确性了嘛,为什么还要siftUp(size() - 1)? |
Beta Was this translation helpful? Give feedback.
-
从理论上说,堆不是一棵完全二叉树,而是基于数组实现的堆才是一棵完全二叉树。如果基于指针实现的堆,不一定是完全二叉树。堆的定义中只要求父子节点保证有序性,并没有说一定是完全二叉树。 |
Beta Was this translation helpful? Give feedback.
-
note: |
Beta Was this translation helpful? Give feedback.
-
Python |
Beta Was this translation helpful? Give feedback.
-
maxHeap->size - 1。为啥要-1 |
Beta Was this translation helpful? Give feedback.
-
// 若节点 i 最大或索引 l, r 越界,则无须继续堆化,跳出 |
Beta Was this translation helpful? Give feedback.
-
作者你好,我觉得在删除节点之前将size进行递减操作比较好,因为当堆剩下一个元素时,会出现数组越界的错误 int pop() {
// 判空处理
if (isEmpty())
throw new IndexOutOfBoundsException();
// 交换根节点与最右叶节点(交换首元素与尾元素)
swap(0, size() - 1);
size--;//提前更新
// 删除节点
int val = maxHeap.remove(size() - 1);
// 从顶至底堆化
siftDown(0);
// 返回堆顶元素
return val;
} |
Beta Was this translation helpful? Give feedback.
-
k神,提个小问题,8.1.2第一句,>=的取逆好像是< |
Beta Was this translation helpful? Give feedback.
-
作者你好,我有个问题比较好奇,就是堆顶出堆操作既然需要用到自顶向下的堆化操作,那为什么入堆的时候不能直接从堆顶而是要从堆底开始呢?这样不会多写一个函数嘛? |
Beta Was this translation helpful? Give feedback.
-
作者你好,我有个问题比较好奇,就是堆顶出堆操作既然需要用到自顶向下的堆化操作,那为什么入堆的时候不能直接从堆顶而是要从堆底开始呢?这样不会多写一个函数嘛?
直接从堆顶开始的话,要么是把堆顶元素换到末尾,将新堆顶往下堆化,要么是从堆顶往下找比他小(或大)的元素,这样逻辑上更复杂了吧?
|
Beta Was this translation helpful? Give feedback.
-
作者你好,1.堆的删除只能从堆顶删除嘛?可以删除任意一个节点嘛?2.堆顶元素出堆那一节,“交换根节点与最右叶节点”,这个最右叶子节点我为啥感觉是7的右子节点。 |
Beta Was this translation helpful? Give feedback.
-
k神你好,我想问一下这里为什么不写成下面这个样子?是有一些别的考量吗? /* 从节点 i 开始,从底至顶堆化 */
void siftUp(int i) {
int p = parent(i);// 获取节点 i 的父节点
while (p < 0 || maxHeap[i] <= maxHeap[p]) {
// 当“越过根节点”或“节点无须修复”时,结束堆化
// 交换两节点
swap(maxHeap[i], maxHeap[p]);
// 循环向上堆化
i = p;
p = parent(i);
}
} |
Beta Was this translation helpful? Give feedback.
-
siftDown()方法在交换元素后应该递归调用自身吧?不然交换元素后,子树有可能不满足堆的定义 |
Beta Was this translation helpful? Give feedback.
-
chapter_heap/heap/
一本动画图解、能运行、可提问的数据结构与算法入门书
https://www.hello-algo.com/chapter_heap/heap/
Beta Was this translation helpful? Give feedback.
All reactions