heap简介

文章详细介绍了大根堆和小根堆的概念,包括heapInsert插入操作和heapify调整过程,并分析了向堆中插入元素及调整为最大(小)堆的时间复杂度,均为O(N*logN)。此外,还提到了heapsort排序的相关时间复杂度。
摘要由CSDN通过智能技术生成

分类

分为大、小根堆。大根堆:父节点≥子节点,小根堆同理。

操作(以大根堆为例)

heapInsert

原理:向堆中插入元素,与其父节点比较如果大于父节点,与父节点交换位置。到新位置后重复此操作。

//i是要插入的下标
func heapInsert(arr []int, i int)  {
	for arr[i]>arr[(i-1)/2]{
		swap(arr,i,(i-1)/2)
		i=(i-1)/2		
	}
}

heapify

原理:将i位置的数和子节点比较,如果子节点大于arr[i],交换位置。交换位置后重复此操作。

func heapify(arr []int,i,heapSize int)  {
	left:=i*2+1
	for left<heapSize{
		lastest:=left
		if left+1<heapSize&&arr[left+1]>arr[left]{
			lastest=left+1
		} 
		if arr[lastest]<=arr[i]{
			break
		}
		swap(arr,i,lastest)
		i=lastest
		left=i*2+1
	}
}

时间复杂度

向堆中插入N个元素

O(N*logN)

证明:

向堆中插入第N个元素时为logN,所以最坏的情况为N*logN。

如果向堆中插入2N个元素,当插入N+1个元素时,时间复杂度为logN,所以最好的时间复杂度为NlogN。插入2N个的时间复杂度和N时候一样,N最好的也是NlogN。

最好最坏的情况下都是N*logN。

将堆调整为最大(小)堆

O(N)

证明:

从堆尾逆向到根节点过程中对每个节点进行heapify:

T(N)=(N/2)*1+(N/4)*2+T(N/8)3+….+1logN→T(N)=O(N)

heapsort

证明类似向堆中插入N个元素的过程。

Heapanalyzer是一种用于分析Java堆转储文件的强大工具,由IBM开发。它可以帮助我们找到可能的内存泄漏点。使用Heapanalyzer的步骤如下: 1. 首先,需要获取一个Java堆转储文件。这个文件通常是在发生内存溢出(OOM)错误时生成的。可以通过设置JVM参数,使其在发生OOM时生成堆转储文件。 2. 下载并安装HeapAnalyzer。可以从IBM官方网站上下载安装包。 3. 打开HeapAnalyzer。在界面上选择“File”菜单,然后选择“Open Heap Dump”选项。 4. 在打开堆转储文件对话框中,选择要分析的堆转储文件,并点击“打开”。 5. Heapanalyzer会开始分析堆转储文件。分析完成后,会显示一个树形结构的对象列表,显示了堆中的各个对象及其关系。 6. 可以使用Heapanalyzer提供的各种功能来进一步分析堆转储文件。例如,可以查找对象的引用链,查看对象的详细信息,查找可能的内存泄漏等。 需要注意的是,Heapanalyzer只是一个工具,它可以帮助我们找到可能的内存泄漏点,但真正的内存溢出问题还需要结合程序来进行进一步的分析。因此,在使用Heapanalyzer时,我们还需要结合其他工具和技术来进行全面的内存分析和调试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [IBM heapAnalyzer分析dump文件](https://blog.csdn.net/qq_36908872/article/details/124061972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [IBM HeapAnalyzer简介使用](https://blog.csdn.net/wwd0501/article/details/78657319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值