《图解算法数据结构》学习笔记1——基础数据结构


前言

本篇内容:简要说明基础数据结构类型,并呈现Python代码。


数组&栈

Python中的[]是可变数组,类似于Java中的ArrayList、C++中的vector

调用appendpop函数实现“先入后出”操作。

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,之后调用函数appendpopleft实现“先入先出”操作。

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当中用{}表示散列表。

散列表的核心是键值对,keyvalue一对一或多对一。

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

总结

以上就是今天的学习笔记,不同的数据结构有不同的适用场景,旨在降低算法的复杂度,提高代码性能。

下期预告:时间复杂度

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值