前言
本篇内容:简要说明基础数据结构类型,并呈现Python代码。
数组&栈
Python中的[]
是可变数组,类似于Java中的ArrayList
、C++中的vector
。
调用append
和pop
函数实现“先入后出”操作。
array = []
array.append(1) # 入栈1 栈空间1
array.append(2) # 入栈2 栈空间1 2
array.pop() # 出栈2 栈空间1
array.pop() # 出栈1 栈空间为空
链表
区别于C++使用struct
实现链表,Java和Python的链表节点是一个类class
。
在Python类的初始化函数_init_
中定义节点值val
和后继节点引用next
。
class ListNode:
def __init__(self, x): # 传入节点值参数
self.val = x # 节点值初始化
self.next = None # 后继节点引用初始化为None
n1 = ListNode(1) # n1 节点值1
n2 = ListNode(2) # n2 节点值2
n1.next = n2 # n1->n2->None
队列
对于队列而言,C++用queue
实现,Java一般用LinkedList
实现,而Python中通常使用双端队列collections.deque
实现。
先导入deque
,之后调用函数append
和popleft
实现“先入先出”操作。
from collections import deque # 双端队列
queue = deque()
queue.append(1) # 入队1 队列1
queue.append(2) # 入队2 队列1 2
queue.popleft() # 出队1 队列2
queue.popleft() # 出队2 队列为空
树
树节点与链表节点的定义类似,不过树是一种非线性结构。
以二叉树为例,一个树节点包含节点值val
、左子节点left
和右子节点right
。
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None # 左子节点初始化为None
self.right = None # 右子节点初始化为None
n1 = TreeNode(1)
n2 = TreeNode(2)
n1.left = n2
图
图的邻接矩阵形式,适合稀疏图,顶点多边少。
顶点数组v
,边数组e
,e[i][j] 代表节点 i+1 和 节点 j+1 之间是否有边。
v = [1, 2, 3, 4, 5]
e = [[0, 1, 1, 1, 1],
[1, 0, 0, 1, 0],
[1, 0, 0, 0, 1],
[1, 1, 0, 0, 1],
[1, 0, 1, 1, 0]]
图的邻接表形式,适合稠密图,顶点少边多。
e[i] 存储节点 i+1 对应的边集和。
v = [1, 2, 3, 4, 5]
e = [[1, 2, 3, 4], # 节点1和节点2、3、4、5有边
[0, 3],
[0, 4],
[0, 1, 4],
[0, 2, 3]]
散列表
类似于Java当中的哈希表HashMap
和C++当中的unordered_map
,Python当中用{}
表示散列表。
散列表的核心是键值对,key
和value
一对一或多对一。
dic = {} # 区分于 []
dic["ya"] = 10085
dic["gao"] = 10087
dic["ya"]
dic["gao"] # 字符串(键)索引
print(dic) # 打印结果:{'ya': 10085, 'gao': 10087}
堆&基于堆实现的数据结构——优先队列
堆是一种基于「完全二叉树」的数据结构,可使用数组实现。以堆为原理的排序算法称为「堆排序」,基于堆实现的数据结构为「优先队列」。
堆分为「大顶堆」和「小顶堆」,顾名思义,分别为维护根节点最大/小的堆结构。
使用优先队列可以完成自动排序,例如Java中的PriorityQueue
、C++中的priority_queue
。
Python中的heapq
模块提供了heappush
方法,调用该方法入队时可以默认建立「小顶堆」,而调用heappop
方法可以默认从堆中弹出并返回最小的值,从而实现堆排序。
heap = []
heappush(heap, 1)
heappush(heap, 5)
heappush(heap, 9)
heappush(heap, 7)
heappush(heap, 3)
print(heap) # 默认整理成小顶堆的数组形式 打印结果:[1, 3, 9, 7, 5]
heappop(heap) # 1
heappop(heap) # 3
heappop(heap) # 5
heappop(heap) # 7
# 优先队列实现自动排序 默认从小到大弹出
print(heappop(heap)) # 打印结果:9
总结
以上就是今天的学习笔记,不同的数据结构有不同的适用场景,旨在降低算法的复杂度,提高代码性能。
下期预告:时间复杂度