一个够用的堆至少要有什么
手写一个够用的大顶堆,至少要有【0】。
插入弹出为何是 O(log n)
第 1 步:一个建好的大顶堆 第 2 步:弹出 24,剩下的重新成堆 第 3 步:弹出 23,剩下的重新成堆 第 4 步:弹出 17,剩下的重新成堆 第 5 步:弹出的顺序:从大到小 24 23 15 13 17 24 23 17 13 1
这个堆里有几个元素
运行下面这段程序: #include <algorithm> #include <iostream> #include <string> #include <utility> #include
第一步数组和上浮插入
最终作品第一步:用一个 vector<int> 当堆,写出大顶堆的 push_up(追加到末尾 + 上浮)。五个数插完之后输出堆顶(堆空着的话输出 空)。 (本题用 g++ -std=c++17 -O0 编译。)
第二步下沉和弹出
加上 sift_down 和 pop_top。把两次弹出的结果拼起来输出(用 / 隔开)。 (本题用 g++ -std=c++17 -O0 编译。)
第三步从乱序数组直接建堆
加上 build_heap:不用一个个 push,从最后一个有孩子的节点倒着下沉。建好之后把整个数组拼起来输出。 (本题用 g++ -std=c++17 -O0 编译。)
第四步拿它去求 Top-K
用前面写好的堆求前 3 大,把结果拼起来输出(用 / 隔开)。 (本题用 g++ -std=c++17 -O0 编译。)
交付堆加 Top-K 加调度
这是这条路线的最终作品。把 push_up / sift_down / pop_top / build_heap / check_heap 和按优先级出队的 pop_max 全写出来,然后一次验完五条:五个数插完,堆顶是 24、一共 5 个
check 说超时了先想什么
~/check 提示「结果对,但超时了」,最该先想的是【0】。
补写堆的下沉
场景:实验机上 ~/work/heap/sift.cpp 读入一串整数,就地建成大顶堆后输出整个数组。建堆要用的 sift_down 还没写。 任务:补全 sift_down(和较大的孩子换、一路下沉),让建堆结果正确。make 编译,./