(14)堆

14、二叉树堆的实现与应用详解 本文详细介绍了二叉树堆的理论基础、实现方法及其在优先队列和排序算法中的应用。内容涵盖二叉树堆的基本特性、使用数组表示法进行插入与删除操作的具体实现,以及通过实验室练习加深理解。此外,还讨论了二叉树堆的优化技巧、性能分析、与其他数据结构的对比及常见问题解决方案。最后总结了其应用前景,并提供了直观的可视化示例帮助读者更好地理解和运用这一高效数据结构。 阅读详情

一、简介

    堆数据结构的性质:堆:任何结点的值都小于或等于其孩子的值的完全二叉树为小根堆,任何结点的值都大于或等于其孩子的值的完全二叉树为大根堆。为了方便使用完全二叉树的性质,假定数组从下标1开始。这样:

leftChild = 2*i;
rightChild = 2*i + 1;
parent = i/2;
    堆数据结构算法分析:

    堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。堆排序是就地排序,辅助空间为O(1)。堆排序是不稳定的。

    堆数据结构实现如下所示:

#include"stdio.h"
inline void swap(int &a,int &b)
{
	int temp=a;
        a=b;
        b=temp;
	
}
void HeapAdjust(int array[],int i,int nLength)//自顶向下调整堆
{
	int nChild;
	int nTemp;//赋值为待调整的 节点
	 
	for(nTemp=array[i];2*i<nLength;i=nChild)//2*i<nLength说明还有左孩子
	{
		nChild=2*i;//左孩子  
			
		/*一共两个子节点的话得到 较大的一个*/		   
		if(nChild<nLength-1&&array[nChild+1]>array[nChild])//nChild<nLength-1 判断到头没有
		      ++nChild;
		   
		    /*如果较大子节点大于父节点  将子节点 调整到父节点*/
		if(nTemp<array[nChild])
		      array[i]=array[nChild];
		else
		      break;//这个地方不加 会出错  第一个会输出第二个 
		      
                array[nChild]=nTemp;//子节点 等于父节点 (不执行break)
	} 
}
void HeapSort(int a[],int length)
{
	/*初建堆 */
    for(int i=length/2;i>0;--i)//从最后一个 非叶子节点调整 (这里的  i是下标) 
	   HeapAdjust(a,i,length);
   
    for(int i=length;i>1;--i)
    {
       	  swap(a[1],a[i]);	/*第一个最大元素跟最后一个交换*/

       	  HeapAdjust(a,1,i);//调整堆 (注意 length=i  由于堆是逐渐变小的)
    }
	
}
int main()
{
	int a[10]={0,1,2,5,3,8,4,7,6};
	HeapSort(a,8);
	 
	for(int i=1;i<9;i++)
	   printf("%d\n",a[i]);
	return 0;
}
    利用堆数据结构可实现优先级队列,优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有查找、插入一个新元素和删除。在最小优先队列(min priority queue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行。

    优先级队列代码实现如下所示:

#include <iostream>
using namespace std;
template<class T>

class priqueue {
private:
	int	n, maxsize;
	T	*x;
	void swap(int &i, int &j)//根据坐标交换数组元素的值
	{	T t = i; i = j; j = t; }
public:
	priqueue(int m)//初始化数组
	{	maxsize = m;
		x = new T[maxsize+1];
		n = 0;
	}
        
	void insert(T t)
	{	int i, p;
		x[++n] = t; //插入的元素放到最后
		for (i = n; i > 1 && x[p=i/2] > x[i]; i = p)    
                    swap(x[p], x[i]);
               
	}
        
	T extractmin()//向下调整堆
	{	           
                int i, c;
		T t = x[1];
		x[1] = x[n--];
                
		for (i = 1; (c=2*i) <= n; i = c) {
			if (c+1<=n && x[c+1]<x[c])
				c++;
			if (x[i] <= x[c])
				break;
			swap(x[c], x[i]);
		}
		return t;
	}
        void print(int n)
        {
                for (int i = 1; i < n; i++) //输出堆
                        cout << x[i] << " ";
        }
        
};

template<class T>
void pqsort(T v[], int n)//先初始化一个数组,然后插入建立一个堆
{	priqueue<T> pq(n); 
	int i;
	for (i = 0; i < n; i++)
            pq.insert(v[i]);
        cout<<"输出排序后的堆:";
        pq.print(n);
}

int main()
{	const int	n = 10;
	int	i, v[n];
        /*以下是通过向上调整堆 建立一个10个元素的堆*/
	for (i = 0; i < n; i++)
		v[i] = n-i;      
	pqsort(v, n);
        cout<<"\n执行插入和删除操作(输入0代表删除最小值,输入其他代表插入)"<<endl;
	priqueue<int> pq(100);
        int count=0;
	while (cin >> i)
		if (i == 0)
                {
                    if(count)
                        cout <<"删除的最小元素为:"<<pq.extractmin() << "\n";
                    else
                        cout<<"请先插入元素"<<endl;
                }	
		else
                {
                    pq.insert(i);
                    count++;
                }
	return 0;
}
二、原理

    (1)高效性。堆中所有结点和根结点之间相差的层数在logn之内。因此其执行效率很高,堆排序通过在同一数组中包含两种抽象结构(堆和元素序列)来避免使用额外空间。

    (2)正确性,即堆数据结构的不变性质。

    (3)抽象性。

    (4)过程抽象。

    (5)抽象数据类型。

三、习题

    (1)习题1:实现基于堆的优先级队列,尽可能的提高运行速度。

    为了提高向上调整堆的速度,在x[0]放置哨兵==当前插入的元素。省去了每次都判断i>1,向上调整堆结束:x[p] <= x[i]。代码如下:

void insert(T t) //向上调整堆
{	
    int i, p;
    x[++n] = t; //插入的元素放到最后               
    x[0]=t;        
    for (i = n;  x[p=i/2] > x[i]; i = p)    
        swap(x[p], x[i]);       
}

    (2)习题4:如何使用优先级队列解决下列问题:

    a、构件霍夫曼码;

    b、计算大型浮点数集合的和;

    c、在存有10亿个数的文件中找到最大的100W个数;

    d、将多个较小的有序文件归并为一个较大的有序文件;

    解答:

    a、构造哈夫曼树时候,需要选取当前数组的两个最小值,删除两个最小值,并将计算之和插入原来数组,采用堆,初建堆,两次调用选取最小值的函数。计算之和之后,调用插入堆并调整堆;b、如果将较小浮点数和较大浮点数相加可能造成丢失精度。所以每次取最小的两个相加。然后将和插入数组集合。最后剩下一个就是所有浮点数的和;c、典型的topK;d、将所有小文件要插入的当前值组成一个堆。取堆最小值,插入排序数组。调整堆。然后插入该小文件下一个元素(无后继则不操作)。

    (3)习题7:在一些计算机上,除以2求当前范围的中点是二分搜索程序中开销最大的部分。假设我们已经正确构建了待搜索的数组,说明如何使用乘以2的操作来替代除法。给出建立并搜索这样一个数组的算法。

     修改后的二分搜索从i=1开始,每次迭代将i设置为2i或2i+1.元素x[1]包含中值,x[2]包含第一个四分位值,x[3]包含第三个四分位值,等等。一种能在O(n)时间内将n元有序数组调整为“堆搜索”顺序的算法。作为该方法的先驱,考虑把一个2^k-1元的有序数组a拷贝到一个“堆搜索”数组b中:a中奇数位的元素按顺序放到b的后半部分,模4余2位置的元素按顺序放到b中剩余部分的后半部分,等等。

14、C++ 优先队列与堆的深度解析 本文深入解析了 C++ 中的优先队列(priority_queue)与堆(heap)数据结构,详细介绍了它们的概念、操作方法及实际应用场景。通过代码示例展示了如何构造和使用优先队列与堆,比较了两者之间的异同,并探讨了它们在任务调度、数据筛选等场景中的应用。文章还分析了优先队列与堆的性能特点,帮助开发者在实际编程中灵活选择合适的数据结构。 阅读详情

相关推荐

HHD Device Monitoring Studio:破解版在串口调试中的实战应用

本文详细介绍了HHD Device Monitoring Studio破解版在串口调试中的实战应用,包括安装指南、串口监控功能解析、Modbus RTU协议分析案例以及自定义协议解析技巧。通过具体操作步骤和性能优化建议,帮助开发者高效完成端口监控和调试任务,提升工作效率。

weixin_29268331的博客 940

Java14:堆

一 优先级队列(堆) 通过层序遍历将二叉树放入数组中,即使用数组保存二叉树结构。 对于完全二叉树的下标关系: leftChild = 2parent+1; rightChild = 2parent +2; parent = (child-1)/2; 1 堆(heap) 堆逻辑上是一个完全二叉树 堆保存在数组中 任意节点的值都大于其子节点的值,称为大堆 任意节点的值都小于其子节点的值,称为小堆 堆...

长不大的大灰狼 291

实战指南:基于Windows Server构建企业级AAA认证体系

本文详细介绍了如何在Windows Server环境下构建企业级AAA认证体系,涵盖AD域服务部署、NPS服务器配置及华为设备对接实战。通过整合Radius协议与AD域账号管理,实现网络设备的统一认证与权限控制,提升企业IT安全管理效率。特别适用于需要零成本实现AAA认证的中大型企业。

weixin_28304023的博客 421

Section 14.堆

一、堆是什么? 堆是一棵完全二叉树 完全二叉树:除了最后一层节点,全部非空的二叉树,且最后一层节点从左往右排布 小根堆:每个节点都小于两个子节点 存储方式:一维数组,下标从1开始,下标x的左子节点是下标2x,右子节点是下标2x+1 二、如何手写一个堆? 初始化,读入堆 for (int i = 1; i <= n; i++) //n是堆的大小 scanf("%d", &h[i]); ::size = n; for (int i = n...

autoAC 521

Layout常见错误汇总-不定时更

1、在做LVS时,出现中断错误 解决方法: 重新建立新的schematic和layout文件,对应好其中的元器件,同时两个文件的名字也要对应好“schematic”和“layout”,其他名字的话软件找不到如何对应。

weixin_38753095的博客 4万+

告别TI官网迷路!手把手教你用C2000Ware为TMS320F28027搭建Proteus仿真工程模板

本文详细指导如何使用C2000Ware为TMS320F28027搭建Proteus仿真工程模板,帮助DSP开发者快速上手。从资源获取、工程目录设计到关键文件配置,再到CCS与Proteus的联调技巧,全面解析仿真工程搭建的每个步骤,特别适合初学者和工程师参考。

weixin_42715608的博客 472

14、编程珠玑笔记十四堆

14、编程珠玑笔记十四堆          本篇名言:“让珊瑚远离惊涛骇浪的侵蚀吗?那无疑是将它们的美丽葬送.”         欢迎转载,转载请标明出处:          使用堆主要用于解决两个问题:排序和优先级队列。          堆是用来表示元素集合的一种数据结构。实际上对中的元素可以是任何有序类型。          作者介绍了二叉树,然后介绍了往二叉树进行插入数值破换二叉

badman250的专栏 3万+

Silvaco TCAD仿真4——DeckBuild实战:从示例库到自定义设计

本文详细介绍了Silvaco TCAD仿真工具DeckBuild的实战应用,从示例库的使用到自定义设计的全过程。通过具体案例和参数修改技巧,帮助用户快速掌握TCAD仿真技术,提升半导体器件设计的效率和精度。特别适合需要从基础入门到进阶操作的工程师和研究人员。

weixin_29284657的博客 434

2.14、堆

堆区动态内存分配 1、堆的特性:需要手动开辟和释放空间。 堆区内存 — 生命周期:从你申请开始到释放或者程序结束而结束 作用域:得到的指针范围 2、使用: 必须先申请才能使用 申请: 头文件 :#include <stdlib.h> 函数: malloc 函数五要素: 1).作用:申请堆区内存 2).函数原型: void *malloc(size_t size); 3).参数: size :表示要申请的堆区内存的大小,字节。 4).返回值:void *:万能指针,成功返回–指针指向一.

feiffer·hu的博客 199

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

本文详细记录了从零开始构建自定义RAGFlow镜像lt/ragflow:0.25.0的全过程。首先介绍了环境准备,包括检查Node.js、Docker版本和项目结构。然后详细说明了构建步骤:编译前端、创建自定义Dockerfile、构建镜像和验证。接着讲解了docker-compose配置修改要点,包括网络定义、MySQL依赖处理等。最后总结了部署过程中遇到的五个关键问题及解决方案,包括networks未定义、MySQL服务依赖、tiktoken文件缺失、数据库配置错误和端口映射问题。通过完整的操作流程和问

liutao841204的专栏 364

从零开始之驱动发开、linux驱动(七、字符驱动之led最终版)

我们上一接用的gpiolib非常杂乱,使用了两种 1.各硬件厂商实现的,如s3c_gpio_cfgpin(S5PV210_GPJ0(5), S3C_GPIO_SFN(1)) 2.系统公共的,如gpio_set_value(S5PV210_GPJ0(4),val) 其实公共的也是对各硬件厂商的封装,用那个都可以,个人建议用系统公共的,应为这样换芯片厂商,不影响任何使用。   2.错误处理基...

To_run_away的博客 2386

算法之路_14、堆的基本操作

一、解释 在上一篇博文堆的预备知识 中,我们谈到,堆实际上可以理解为一个数组表示的完全二叉树。他也具有树的一些性质。在这一篇中主要来记录一些堆的基本操作。其中会涉及到上篇博文中阐述到的部分完全二叉树的性质。 二、代码 1、建立一个大根堆 大根堆是堆的两种形式之一。 根节点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。 大根堆要求根节点的关键字既大...

郭岚的博客 1万+

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针

专注于编程、AI、人工智能等多个领域内容研究和分析 1080

重温算法Day14:堆

堆”(Heap)堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。堆存储:数组中下标为 i 的节点的左子节点,就是下标为 i∗2 的节点,右子节点就是下标为 i∗2+1 的节点,父节点就是下标为 2i​ 的节点。 堆排序:大致分解成两个大的步骤,建堆和排序。建堆:方式1:从下往上堆化:在堆中插入一个元素的思路。尽管数组中包含 n 个数据,但是我们可以假设,起初堆中只包含一个数据,就是下标为 1 的数据。然后,我们调用前面讲的插入操作,将下标从 2 到 n 的数据依.

Linzhongyilisha的专栏 259

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

快排、堆排、归并、优化快排、优化堆排,✨5种方式教你秒解——>【力扣17.14. 最小K个数】

文章目录????毛遂自荐⭐题目????思路✨代码????快速排序????快排分区思想(优化)????堆排序????堆排序(优化)——>构造固定堆????归并排序✨补充知识点????最后 ????毛遂自荐 毛遂自荐一下,给大家推荐一下自己的专栏????,欢迎小伙伴们收藏关注???? 大厂面试题专栏 Java专栏 爬虫专栏 更多专栏尽在主页,点我????!!! ⭐题目 2021-09-13力扣每日一题:面试题 17.14. 最小K个数 ????思路 这题表面上一看,其实就是一

Code皮皮虾的博客 547

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

日志 7.14 pwn 堆

调试技巧 pie文件找到基地址的几种方法: 1) gdb-vmmap 2) ps -aux | grep <文件名> //查看pid cd /proc//map_files ll //查看内存映射 ida 可以在.data直接查看已经定义的全局变量,如果全局变量是指针记得查看对应的地址,有时ida会把指针以字符串形式显示出来,这时手动转为十六进制更容易查看 堆题多查看已定义...

RobinZZX的博客 337

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

14 - heapq模块:堆操作

这篇文章围绕堆操作这道算法题展开,梳理解题思路、关键数据结构与复杂度分析,并补充实现时需要注意的边界处理和常见陷阱,适合刷题复盘、面试准备以及快速回顾标准解法。

丨汀、的博客 59

算法通关村第14关【青铜】| 什么是堆

堆构造

Candy___i的博客 262

欧尼酱讲JVM(14)——堆

我以我身上20斤肉发誓,这绝对是全网最全,最详细的有关【堆】的介绍,包含代码举例与JVisualVM演示对象分配过程,有动图,绝对通俗易懂。什么?不信?不信我就瘦20斤给你看!!

化身孤岛的鲸 999

【码道初阶】LeetCode面试题 17.14 最小 K 个数:两种堆解法的“同题不同命”

本文对比了两种堆解法求最小K个数的性能差异。代码1使用小根堆存储所有元素后弹出K次,时间复杂度O(n log n),空间O(n)。代码2维护大小为K的大根堆,仅保留候选最小K个数,时间O(n log k),空间O(k)。当K远小于N时,代码2显著更优。代码1实现简单适合K接近N的情况,代码2则是面试推荐的标准解法,通过大根堆作为"门槛"优化了复杂度。文章还讨论了边界处理、常数优化和快速选择等进阶方案,指出代码2在大多数情况下是最佳实践。

月明长歌的博客 908

Java算法14-高级数据结构:堆

本节课我们介绍另外一种数据结构——堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的“堆”是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O(logN),这样尽管删除的时间变慢了,但是插入的时间快了很多,当速度非常重要,而且有很多插入操作时,可以选择用堆来实现优先级队列。 1 堆的定义 ① 它是完全二叉树,除了树的最后一层节点不需要是满的,其它的每一层...

fujiedada的专栏 202

算法导论学习笔记(14)——斐波那契堆

斐波那契堆同二项堆一样,也是一种可合并堆。斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看《算法导论》第17章)。和二项堆一样,斐波那契堆由一组树构成。这种堆松散地基于二项堆,说松散是因为:如果不对斐波那契堆做任何DECREASE-KEY 或 DELETE 操作,则堆中每棵树就和二项树一样;但是如果执行这两种操作,在一些状态下必须要破坏二项树的特征,比

xiangzhang321的专栏 4168

算法精解----14、堆

1、用途快速找到最大或最小元素,父节点始终大于或小于左右节点,左右节点之间没有关系。最底层最右端的节点就是最后一个节点。 2、节点成S行自上而下,自左向右顺序编号。元素对应在数组当中。若父节点编号为n,那么左右节点分别为2n+1,2n+2。可以随机访问,虽然属于二叉树,但是不用指针把每个节点串起来体现节点之间的关系。

张勇1234的博客 269

数据结构与算法之美(笔记14)堆的应用

一、优先级队列 我们前面讲过,队列最大的特性就是先进先出。不过,在优先级队列中,数据的出队顺序不是先进先出,而是按照优先级来,优先级最高的,最先出队。 一个堆就可以看做一个优先级队列。很多时候,它们只是概念上的区分而已。往优先级队列中插入一个元素,就相当与往堆中插入一个元素,从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素。 1.合并有序小文件 假设我们有100个文件,每个文件的大...

weixin_42073553的博客 255

14. 对象一定分配在堆中吗?如何判断对象可以被回收

对象一定分配在堆中吗?如何判断对象可以被回收

sinat_33739100的博客 158

算法14--优先级队列(堆)

堆主要用于解决排序和topK问题,topK问题还可以使用快速选择算法解决,其时间复杂度为o(n),但空间复杂度较高。注意是排序后的第 k 大元素,不是第 k 个不同的元素。int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5。

m0_74494481的博客 875
上一篇: (13)搜索
下一篇: 一道有关hash的POJ题目:POJ1200 Crazy Search
ddppqq
博客等级 码龄17年 15粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值