(该篇基本等价于up主视频的学习笔记记录)
基本概念
- 堆是一种满足某种特性的完全二叉树
- 大顶堆特性是父节点大于等于任一子节点,堆顶元素是整个堆最大的值
- 小顶堆特性是父节点小于等于任一子节点,堆顶元素是整个堆最小的值
- 基本操作及其时间复杂度
- 访问(通过索引获取):-(堆没有索引)
- 搜索(通过元素获取):O(N)
- 插入:O(logn)
- 删除:O(logn)
基本操作python实现
以小顶堆为例
#调用
import heapq
nums = [2, 3, 5, 1, 54, 23, 132]
#第一种创建堆方法
heap = []
for num in nums:
#添加元素
heapq.heappush(heap, num)
#第二种创建堆方法
nums = [2, 3, 5, 1, 54, 23, 132]
heapq.heapify(nums)
#获取并删除堆顶元素
heapq.heappop(nums)
# 实现大根堆,通过自定义对象
import heapq
class MyObject:
def __init__(self, val):
self.val = val
def __lt__(self, other):
return self.val > other.val
q = []
heapq.heappush(q, MyObject(50))
#创建
Class Heap():
def __init__(self):
self.heap=[]
#添加元素
def add(self,val):
self.heap.append(val)
idx=self.size()-1
while idx>0:
root_idx=(idx//2) if idx%2 else (idx//2-1)
if self.heap[idx]<self.heap[root_idx]:
self.heap[idx],self.heap[root_idx]=self.heap[root_idx],self.heap[idx]
idx=root_idx
else:
break
#获取堆顶元素
def top(self):
return self.heap[0]
#删除堆顶元素
def del(self):
del self.heap[0]
#堆的长度
def size(self):
return len(self.heap)
#遍历
def traverse(self):
for i in self.heap:
print(i)
题目
熟悉数据结构
熟悉数据结构+算法
这里例举一般遇到这种数据结构的题都有哪些解法,建议先看算法解题套路相关文章
(待补充)