首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏光城(guangcity)

    如醉如痴之最小堆

    如醉如痴之最小堆 0.说在前面1.问题2.思考3.自虐4.回归5.总结6.作者的话 0.说在前面 一道简单的题,可以让你如醉如痴,更是因为这一道题,你才会学会很多,不要小看简单,简单中蕴含深意。 看到这个问题,对应的数据结构为堆排序中的最小堆! 实际就是利用最小堆去解决Top-k问题。 2.思考 这道题,先来一个简单的思路,通过导入库来实现。 接下来,让我们一起来从最小堆理论分析,到最小堆实现过程。。 一个最小堆满足完全二叉树性质! 最小堆满足的特点是:比左右子节点都小,并且当前节点位置如果为i,则左子节点为2i,右子节点为2i+1。 注意一点,这里写的是自顶向下的堆调整! [i * 2 + 1]: j = i * 2 else: j = i * 2 + 1 if self.heapList

    48630发布于 2019-09-20
  • 来自专栏AI那点小事

    小堆

    反之,如果父节点的键值总是小于等于任何一个子节点的键值,那么这时称之为最小堆或者小顶堆。 最大堆算法如下(最小堆与之类似,不在此赘述): //最大堆的插入操作 bool Insert(int num){ //最大堆已满则无法插入 if(this->IsFull()){ return < num ; i /= 2){ this->data[i] = this->data[i/2]; } this->data[i] = num; return true; } ---- 删除操作 算法如下: 1)如果堆为空,那么不能进行删除 2)否则,首先保存根节点的键值,之后用最后一个结点来代替根节点,对堆进行相应的调整使之称为最大堆或者最小堆。 < num ; i /= 2){ this->data[i] = this->data[i/2]; } this->data[i] = num; return true;

    1.3K10发布于 2020-04-20
  • 来自专栏绝活编程学习

    小堆的实现

    堆可以作为最大堆或最小堆来使用,这取决于如何对数据进行初始化。 * `AdjustUp(HPDataType* _a, int child)`:向上调整函数,调整堆的性质以保证满足堆的性质要求(最大堆或最小堆)。 * `AdjustDown(Heap* hp)`:向下调整函数,调整堆的性质以满足堆的性质要求(最大堆或最小堆)。 // 根据二叉树的上序遍历规则计算出上一个父节点的索引位置(注意是除以2而不是减1) if (_a[parent] > _a[child]) // 如果上一个父节点的值大于当前节点的值 4 : hp->_capacity * 2; // 将新的容量设置为原最大容量的两倍(如果原最大容量为0,则设置为4) HPDataType* newheap = (HPDataType

    41310编辑于 2024-12-16
  • 来自专栏算法之名

    小堆与索引堆

    我们先来完成一个最小堆,采用JDK的ArrayList作为底层数据结构。 (int index) { return index * 2 + 2; } private void shiftUp(int index) { //如果当前节点不是根节点 (int index) { return index * 2 + 2; } private void shiftUp(int index) { //如果当前节点不是根节点 (int index) { return index * 2 + 2; } private void shiftUp(int index) { //如果当前节点不是根节点 4976 8498 7307 7161 1 2 7 9 10 6 3 8 4 1 2 7 9 0 6 3 8 4 7307 3438 4971 4976 7161 7307 8294 8498

    1.1K10发布于 2020-10-26
  • 来自专栏向治洪

    修改android最小堆内存

    有两个地方决定了一个堆的最大内存:  1)dalvik/vm/Init.c中的  gDvm.heapSizeMax = 16 * 1024 * 1024;    // Spec says 75% physical mem  2) TODO: base these on a system or application-specific default         */        gDvm.heapSizeStart = 2   = 32 * 1024 * 1024; // Spec says 75% physical mem        gDvm.stackSize = kDefaultStackSize;   2.

    1.6K60发布于 2018-01-29
  • 来自专栏ml

    HDUOJ----4006The kth great number(最小堆...)

    Sample Input 8 3 I 1 I 2 I 3 Q I 5 Q I 4 Q Sample Output 1 2 3 Hint Xiao Ming won't ask Xiao Bao the 因而普通的排序是不行的,所以很好定义为最小堆,最大堆的求解... 但是对堆的求解也有两种,第一种是构造一个k堆,然后再输入数据,不断更新维护这个k堆,我们暂时叫他第k堆吧... n,k,i,temp; 8 char ss[2]; 9 multiset<int> sta; 10 while(scanf("%d%d",&n,&k)! else cout<<*(sta.begin())<<endl; 31 } 32 } 33 return 0; 34 } 方法二: 采取传统的最小堆 1 /*最小堆hdu 4006*/ 2 /*@code Gxjun*/ 3 #include<stdio.h> 4 #include<string.h> 5 #define maxn 1000002

    918110发布于 2018-03-22
  • 来自专栏Python数据结构与算法

    JAVA学习(2)-全网详细~

    System.out.printf("%d\n",a);//以格式化形式进行内容输出 } } 单位换算 整型取值范围 上面提到 一个int 是 4 字节 那么它就有 4 * 8 = 32位 对于正数有2^ 31 - 1种情况 减去全为0 的这一种情况 所以正数的范围是 0 - 2^31-1 负数范围是 -2^31 - -1 所以整型取值范围是 -2^31 - 2^31 - 1 package Oniline; public class HelloWorld{ public static void main(String[] args) { /* * 1.整型int 占 4字节 * 2. 标识符 : 数字 字母 下划线 $ */ int a = 0; System.out.println(2a); } } 「Identifiers」 are for naming 严格区分大小写 练习2: Which of these data types requires the most amount of memory?

    27510编辑于 2024-01-18
  • 来自专栏龙进的专栏

    算法与数据结构之最大最小堆

    ,左子结点下标是2*i, 右子结点的下标是2*i+1。 ·最小堆性质: 结点的键值都大于等于其父结点的键值。 满足最大堆性质的二叉堆叫做最大堆,满足最小堆性质的二叉堆叫做最小堆。 最大堆的根结点中存储着最大的元素,最小堆的根结点中存储着最小的元素。 ("left key = %lld, ", nd[2*i]); if(2*i+1<=h) printf("right key = %lld, ", nd[2*i+ ) max_Heapify(i); for(int i=1;i<=h;i++) cout<<" "<<nd[i]; cout<<endl; } 生成最小堆 我们只需要把上面的生成最大堆的代码稍加修改,就能改成生成最小堆的代码。

    1.9K30编辑于 2022-10-31
  • 来自专栏Python数据结构与算法

    JAVA学习(2)-全网详细~

    System.out.printf("%d\n",a);//以格式化形式进行内容输出 } } 单位换算 整型取值范围 上面提到 一个int 是 4 字节 那么它就有 4 * 8 = 32位 对于正数有2^ 31 - 1种情况 减去全为0 的这一种情况 所以正数的范围是 0 - 2^31-1 负数范围是 -2^31 - -1 所以整型取值范围是 -2^31 - 2^31 - 1 package Oniline; public class HelloWorld{ public static void main(String[] args) { /* * 1.整型int 占 4字节 * 2. 标识符 : 数字 字母 下划线 $ */ int a = 0; System.out.println(2a); } } 「Identifiers」 are for naming 严格区分大小写 练习2: Which of these data types requires the most amount of memory?

    28210编辑于 2024-01-18
  • 来自专栏kalifaの日々

    POJ2431-最优队列(最小堆)解法

    include<vector> #include<algorithm> using namespace std; typedef pair<int,int> p; bool comp(p p1,p p2) { return p1.first<p2.first; } int main() { int N,P,L; cin>>N; vector

    input;

    87070发布于 2018-04-28
  • 来自专栏笃信好学

    用心的Word教程 笔记2

    换行不能按enter,要shift+enter 图片 图标编号,勾选包含章节号 图片 表格或图片如果在文本中被引用,例如见图1-4,要使用交叉引用 图片 如果调整表格顺序,没有更新,例如表格1移动到表格2

    1.9K00编辑于 2023-02-19
  • 来自专栏笃信好学

    用心的EXCEL课程 笔记2

    输入 ,会出现在所有被选的工作表 如何在多个工作表内同时输入一样的信息: Ctrl 选择多个工作表,输入 ,这时内容会出现在所有被选的工作表 上下移动方法》1.找到任意单元格,鼠标放在上或者下边框,双击2.

    1.5K30编辑于 2023-03-18
  • 来自专栏Titan笔记

    使用最小堆思想实现哈夫曼编解码

    构建哈夫曼树的方式 假设有7个树(一个节点),其权重分别为1、2、3、4、5、6、7。 ? 找到两个权重最小的树1和2。 ? 1 和2 分别作为新树的左右子树,新树的根结点权重为1 2 =3。 重复步骤2和3,直到只剩一棵树的时候,即为Huffman树。 下面描述下我实现哈夫曼编码的主要核心的几个部分: 构建哈夫曼树 构建哈夫曼树的第一步是建立最小堆:先读取用户输入的字符与其对应的权值,并将其无序插入到堆中,再根据权值,不断调整堆,使其变成为最小堆。 有了最小堆以后,就可以开始构建哈夫曼树了。整体思路是:先创建一个空的树的节点,再从刚刚创建好的最小堆中,取出两个最小节点,作为这个节点的左右分支。显然,这个节点为非叶节点。 ->weight>tree->weight;i/=2){ H->data[i]=H->data[i/2]; } H->data[i]=tree; return true; } // 从堆中取出最小元素的实现

    2.7K20发布于 2020-07-22
  • 来自专栏码力up

    【重学数据结构】堆 Heap - 最小堆&最大堆

    堆中某个节点的值总是不大于或者不小于父节点的值,并且堆是一棵完全二叉树 堆的数据结构 最小堆:每个父节点的值都小于自己子节点的值 最大堆:与最小堆的定义正好相反,每个父节点的值都大于自己子节点的值 手写实现堆 从对堆的数据结构介绍上可以看到,小堆和大堆的唯一区别仅是对元素的排序方式不同。 fastjson2-extension\2.0.12\fastjson2-extension-2.0.12.jar;E:\repository\com\alibaba\fastjson2\fastjson2 堆排序算法,TopN的场景题,以及优先级队列是采用最小堆的性质去做的 堆的数据结构实现方式有哪些? 二叉堆使用数组存储,根节点索引为0,子节点n的索引为2n+1和2n+2。 最小堆和最大堆的区别是什么? 最小堆:任何一个父节点的值都小于或等于其子节点 最大堆:任何一个父节点的值都大于或等于其子节点

    21410编辑于 2025-12-18
  • 来自专栏数据库技术日积月累

    python实现堆(最大堆、最小堆、最小最大堆)

    def left_child(self, i): return 2 * i + 1 def right_child(self, i): return 2 * i + 2小堆class MinHeap: def __init__(self): self.heap = [] def parent(self, i): return (i - 1) // 2 def left_child(self, i): return 2 * i + 1 def right_child(self, i): return 2 * i + 2 def get_min(self): if not self.heap: return None return def left_child(self, i): return 2 * i + 1 def right_child(self, i): return 2 * i + 2

    2.9K64编辑于 2023-03-30
  • 来自专栏Michael阿明学习之路

    数据流的中位数(大小堆

    例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中 示例: addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2 进阶: 如果数据流中所有整数都在 0 到 100 范围内 数据流中的中位数 链接 2. 大小堆解题 参考我的博客 数据结构 堆(优先队列) 类似题目: LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现) LeetCode 703. } else minHeap.push(num); } } double findMedian() { if(n%2

    71510发布于 2020-07-13
  • 来自专栏掘金安东尼

    小堆解决【数据流中位数】问题,nice 图解~

    更多精彩,请关注我的 算法专栏 (●'◡'●) 本篇带来利用大小堆解决“获取数据流的中位数”的问题。 题目: 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中 根据只需获得中间数的想法,可以将数据分为左右两边,一边以最大堆的形式实现,可以快速获得左侧最大数, 另一边则以最小堆的形式实现。其中需要注意的一点就是左右侧数据的长度差不能超过1。 查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(log n); 图解:(图解来源-Maple) 动态维护一个最大堆和最小堆,最大堆存储一半数据,最小堆存储一半数据,维持最大堆的堆顶比最小堆的堆顶小 this.container[0]; return null; } } // 最大堆 this.A = new Heap(); // 最小堆

    76510编辑于 2022-09-19
  • 来自专栏算法channel

    机器学习|海量数据求top K 之最小堆实现

    02 — 最小堆实现思路 实现思路: 从海量数据中按照索引,选取前K个元素,建立一个小根堆; 遍历第K+1个元素, 若满足:这个元素不小于当前堆顶,则继续下一个遍历; 若满足:这个元素大于当前栈顶,则与堆顶元素交换 ,然后调整堆为最小堆 直到遍历结束 03 — 最小堆的python实现 class TopKByHeap(object): __k=0 __topk=None __bigdata "" right child for i index """ def __right(self,i): return 2*i+2 """ swap item)+',' print(r+'\r') """ test following """ topkheap = TopKByHeap(bigdata=[6,4,-9,10,3,2,14,5,6,4,3,2,6,5,444,665,4,3 ],k=5) topk = topkheap.findTopK() 输出结果: 1th: -9,3,6,10,4, 2th: 2,3,6,10,4, 3th: 3,4,6,10,14, 4th: 4,5,6,10,14

    1.2K60发布于 2018-04-02
  • 理解 Golang 中的最大最小堆、`heap` 与优先队列

    这些场景的共同特点是,我们不仅需要找到当前的值,还需要高效地添加新元素和删除值。 此时,原本的值(最小或最大元素)已经被移动到了切片的末尾。然后,heap.Pop 会调用我们自己实现的 Pop() 方法。 示例一:整数最小堆这个例子展示了如何基于 []int 切片构建一个整数最小堆。// 该示例演示了如何使用 heap 接口构建一个整数最小堆。 h := &IntHeap{2, 1, 5} heap.Init(h) // 将无序的切片整理成一个最小堆。 // 向堆中推入一个新元素。 (i - 1) / 2 (整数除法,自动向下取整)例如,对于一个最小堆,其切片为 [3, 5, 8, 10, 7],它的逻辑树形结构如下: 逻辑树形结构 物理切片存储

    60910编辑于 2025-06-08
  • 来自专栏聊聊技术

    原 初学算法-基于最小堆的优先级队列C++

      笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出!   private:     vector<T> A;     int _size;   //The size of heap     int parent(int i) { return (i-1)/2;  }  //Get the index of ith parent     int left(int i)   { return 2*i+1; }    //Get the index of ith left  child     int right(int i)  { return 2*i+2; }    //Get the index of ith right child public:     //Here     Min_Heap(vector<T> _array)     {         _size = 0;         A.clear(); A.reserve(_array.size()*2)

    97490发布于 2018-05-18
领券