仅针对算法刷题进行针对性python语法学习
python算法预备语法知识(三)——数据结构
目录
1. Array数组
数组是一种基础的数据结构,在python中常用list
来表示数组
特性
在内存中有一段连续的内存来存储一组类型相同的数据
那么如果我们人为的令list
内数据类型都一致,此时list
就是python意义下的数组
这样的数组具有几个特点:
- 优点:访问非常快(用索引)
- 缺点:查询、插入、删除非常的慢
2. LinkedList链表
链表是一种基础的数据结构,在python中常用一个自定义的类来表示链表
特性
在内存中有一段不连续的内存,每个内存结点首尾相接,来存储一组类型相同的数据
定义如下:
# 链表
class ListNode:
def __init__(self, x):
self.val = x
self.next = none
在leetcode平台刷题过程中,往往链表结构已经创建好,所以写算法过程中只需要专注于核心代码编写,这里不需要过于深入了解
链表具有几个特点:
- 优点:插入、删除非常快
- 缺点:查询、访问(用索引)非常的慢
3. Hash Table哈希表
哈希表是一种基础的数据结构,在python中常用Dictionary
来表示哈希表,C++常用map
容器
特性
由于字典的特性,在利用key
查询时,利用到哈希算法因此速度很快。一般用于计数等需频繁查询的数据结构
链表具有几个特点:
- 优点:查询,插入,删除,非常快
- 缺点:不能用index访问
4. Queue队列
队列是一种先入先出(FIFO)的数据结构,在python中dequq
来表示队列,C++常用queue
容器
队列往往适用于bfs
特性
队列一般使用双端队列deque
实现:
-
双端队列:两头都可以作为队列,因此也可理解为"双端栈",利用
deque
实现from collections import deque a = [1,2,3] q = deque(a) # 尾部添加头部弹出 q.append(1) q.popleft() # 头部添加尾部弹出 q.appendleft(1) q.pop()
5. Stack栈
栈是一种先入后出的数据结构,在python中常用list
或者deque
来表示栈,C++常用stack
或vector
容器
栈往往适用于dfs
特性
栈一般使用双端队列deque
或栈list
实现:
-
双端队列:两头都可以作为队列,因此也可理解为"双端栈",利用
deque
实现from collections import deque a = [1,2,3] q = deque(a) # 尾部添加&弹出 q.append(1) print(q[-1]) q.pop() # 头部添加&弹出 q.appendleft(1) print(q[0]) q.popleft()
-
列表:具有栈所需要的基本功能,不需要导入deque库
a = [1,2,3] # 尾部添加&弹出 a.append(1) a[-1] a.pop()
6. Heap堆
堆,是一种特别的完全二叉树,可以实现自动排序。在python中用函数来将list
转换为heap
,C++中则为优先队列
特性
堆分为大顶堆和小顶堆
大顶堆就是每次pop出来的都是这组数据里的最大值
小顶堆就是每次pop出来的都是这组数据里的最小值
一般会从heapq库中导入几个需要用到的函数:
- heapify:用于将列表转换为堆,默认小顶堆
- heappush:向堆内插入元素
- heappop:从堆内弹出元素
- nlargest:前n个最大的值
- nsmallest:前n个最小的值
小顶堆
from heapq import heapify, heappush, heappop
a = [1,2,3]
heapify(a) # 将a转化为小顶堆
heappush(a, 4) # 此时a为[1,2,3,4]
heappop(a) # 此时a为[2,3,4],弹出
nlargest(2, a) # 返回[3,4],注意参数位置,数字在前堆名在后
nsmallest(2, a) # 返回[2,3],注意参数位置,数字在前堆名在后
大顶堆
python中如果想要改成大顶堆,那么通用做法是将原数据乘-1,转化为小顶堆之后,取出的数据再乘-1,变换回去
简而言之,就是入堆和出堆的数据都要乘-1