2026/4/18 7:26:22
网站建设
项目流程
如何在百度做网站推广,阿三做网站,网站的性能需求,免备案虚拟主机1元完全二叉树#xff0c;仅允许最底层的节点不完全填满#xff0c;且最底层的节点必须从左至右依次连续填充。堆#xff08;heap#xff09;是一种满足特定条件的完全二叉树#xff0c;主要可分为两种类型#xff1a;
1#xff0c;小顶堆#xff08;min heap#xff09;…完全二叉树仅允许最底层的节点不完全填满且最底层的节点必须从左至右依次连续填充。堆heap是一种满足特定条件的完全二叉树主要可分为两种类型1小顶堆min heap任意节点的值 小于其子节点的值。2大顶堆max heap任意节点的值 大于其子节点的值。编程语言提供的是优先队列priority queue定义为具有优先级排序的队列。堆通常用于实现优先队列大顶堆相当于元素按从大到小的顺序出队的优先队列。我们可以将“优先队列”和“堆”看作等价的数据结构。/* 初始化堆 */// 初始化小顶堆QueueIntegerminHeapnewPriorityQueue();// 初始化大顶堆使用 lambda 表达式修改 Comparator 即可QueueIntegermaxHeapnewPriorityQueue((a,b)-b-a);/* 元素入堆 */maxHeap.offer(1);maxHeap.offer(3);maxHeap.offer(2);maxHeap.offer(5);maxHeap.offer(4);/* 获取堆顶元素 */intpeekmaxHeap.peek();// 5/* 堆顶元素出堆 */// 出堆元素会形成一个从大到小的序列peekmaxHeap.poll();// 5peekmaxHeap.poll();// 4peekmaxHeap.poll();// 3peekmaxHeap.poll();// 2peekmaxHeap.poll();// 1/* 获取堆大小 */intsizemaxHeap.size();/* 判断堆是否为空 */booleanisEmptymaxHeap.isEmpty();/* 输入列表并建堆 */minHeapnewPriorityQueue(Arrays.asList(1,3,2,5,4));堆通常作为实现优先队列的首选数据结构其入队和出队操作的时间复杂度均为Ologn 。给定一组数据我们用堆存储然后不断地执行出堆操作就可以得到有序数据。Top-k 是一个经典算法问题可以使用堆数据结构高效解决 ,选择热度前 5 选取销量前 5 的商品等都是常见的应用。/* 基于堆查找数组中最大的 k 个元素 */QueueIntegertopKHeap(int[]nums,intk){// 初始化小顶堆QueueIntegerheapnewPriorityQueueInteger();// 将数组的前 k 个元素入堆for(inti0;ik;i){heap.offer(nums[i]);}// 从第 k1 个元素开始保持堆的长度为 kfor(intik;inums.length;i){// 若当前元素大于堆顶元素则将堆顶元素出堆、当前元素入堆if(nums[i]heap.peek()){heap.poll();heap.offer(nums[i]);}}returnheap;}总共执行了 n 轮入堆和出堆堆的最大长度为k 因此时间复杂度为nlogk 。该方法的效率很高当k较小时时间复杂度趋向n 当 k 较大时时间复杂度不会超过 nlogn 。