关于堆:堆优先队列进阶TopK3D接雨水CJsRust语言描述
1 前言在之前的文章里,我分享了Js版的堆实现和C语言版的堆实现, 了解的话,堆的实现其实并不难,以大顶堆为例,简略演绎就是插入时候,比节点小,就一直向下沉,让更大的上浮,直到最大的上浮到根节点。 1. 数据与构造与算法: 堆 C语言形容 2. 数据结构与算法: 堆 优先队列 JavaScript语言形容 优先队列基于堆实现,顾名思义是一个有优先级的队列,最高优先级的最先出列,低优先级最初出列(如果是最小堆则刚好相同)。明天咱们就用堆和优先队列高效解决一些问题,别离是经典的TopK问题-堆解法,以及3D接雨水-优先队列解法。 2 TopK问题-堆解法题目:215. 数组中的第K个最大元素 2.1 思路在之前的文章里,我分享了基于Partition和ThreePartition算法的原地排序,来高效求解TopK问题,原地排序,没有应用额定的空间,空间复杂度很低,然而工夫复杂度稳定比拟大,如果随机取的基准值很现实,那么效率超高,但如果数组里值散布很发散,随机取的基准值也很不现实,那么这种极其状况下,那么效率就不是很高,尽管《算法导论》证实了Partition算法是近似线性,但其线性常数项相对比1大多了; 而堆解法呢,就是稳固的工夫空间复杂度,建堆的最差复杂度是确定的,遍历一遍的复杂度只有O(N),能够确定在kLog(k) + O(N)。 2.2 C语言形容先建设一个容量为k的最小堆,后续的元素,只有比堆顶大的,才入堆,否则间接略过,最初堆顶元素就是第K大元素。 typedef struct MinHeap { int *data; //数据域 int size; //长度 int max;//最大长度} MinHeap;void insert(struct MinHeap *p, int item){ if (p->size == p->max) { printf("******:\n"); return; } int i = ++p->size; for (; p->data[i/2] > item; i/=2) { if (i <= 1) { break; } p->data[i] = p->data[i/2]; } p->data[i] = item;}void delete(struct MinHeap *p){ p->data[1] = p->data[p->size--]; int i = 1; int tmp; while(2*i <= p->size){ //如果有右节点 if (2*i + 1 <= p->size) { if (p->data[2*i + 1] < p->data[i] || p->data[2*i] < p->data[i]) { if (p->data[2*i + 1] < p->data[2*i]) { tmp = p->data[i]; p->data[i] = p->data[2*i + 1]; p->data[2*i + 1] = tmp; i = 2*i + 1; }else{ tmp = p->data[i]; p->data[i] = p->data[2*i]; p->data[2*i] = tmp; i = 2*i; } }else{ return; } }else{ //只有左节点 if (p->data[2*i] < p->data[i]) { tmp = p->data[i]; p->data[i] = p->data[2*i]; p->data[2*i] = tmp; i = 2*i; }else{ return; } } }}int findKthLargest(int* nums, int numsSize, int k){ struct MinHeap *heap; heap=(struct MinHeap *)malloc(sizeof(struct MinHeap)); if (heap == NULL) { printf("malloc error \n"); return 0; } heap->size = 0; heap->max = k + 1; heap->data = (int*)malloc(sizeof(int)*heap->max); if(heap->data == NULL) { printf("malloc error \n"); return 0; } heap->data[0] = 9999; for (int i = 0; i < numsSize; ++i) { if(i < k){ insert(heap, nums[i]); }else{ if(nums[i] > heap->data[1]){ delete(heap); insert(heap, nums[i]); } } } return heap->data[1];} ...