Python语言版的数据结构与算法
这篇文章将从Python语言的角度,对数据结构与算法做详细的阐述,并且给出对应的代码实现。
线性结构是数据结构中最基本、最常用的结构之一,它是一种一对一、一对多的关系。其中,数组是最基本的线性结构,Python中提供的List就是一种典型的数组结构。
1、List
在Python中,列表(List)是一种高效、灵活、强大的数据类型。通过索引的方式,我们可以非常方便地访问、添加、插入、删除和修改元素。下面是对应代码:
# 定义一个列表 list1 = [1, 2, 3, 4, 5] # 访问列表中的元素 print(list1[0]) # 输出1 # 添加元素 list1.append(6) print(list1) # 输出[1, 2, 3, 4, 5, 6] # 插入元素 list1.insert(0, 0) print(list1) # 输出[0, 1, 2, 3, 4, 5, 6] # 删除元素 del list1[0] print(list1) # 输出[1, 2, 3, 4, 5, 6] # 修改元素 list1[0] = 0 print(list1) # 输出[0, 2, 3, 4, 5, 6]
2、Stack
栈(Stack)是一种后进先出(LIFO)的数据结构,通过push()和pop()方法,实现对栈中元素的添加和删除。下面是对应代码:
class Stack:
def __init__(self):
self.items = []
# 判断栈空
def isEmpty(self):
return self.items == []
# 添加元素
def push(self, item):
self.items.append(item)
# 删除元素
def pop(self):
return self.items.pop()
# 返回栈顶元素
def peek(self):
return self.items[len(self.items)-1]
# 返回栈中元素数量
def size(self):
return len(self.items)
s = Stack()
s.push('hello')
s.push('world')
print(s.pop()) # 输出world
树形结构是一种非线性结构,适合存储具有层次关系的数据结构。常见的树形结构有二叉树、二叉搜索树、AVL树、红黑树等。
1、二叉搜索树
二叉搜索树(Binary Search Tree)是一种树形结构,每个节点最多有两个子节点。其中,每个节点的值都大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。下面是对应的代码实现:
# 定义一个节点类
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
# 定义一个二叉搜索树类
class BST:
def __init__(self):
self.root = None
# 插入节点
def insert(self, val):
node = TreeNode(val)
if not self.root:
self.root = node
else:
current = self.root
while True:
if current.val > val:
if not current.left:
current.left = node
break
else:
current = current.left
else:
if not current.right:
current.right = node
break
else:
current = current.right
# 搜索节点
def search(self, val):
current = self.root
while True:
if not current:
break
elif current.val == val:
return True
elif current.val > val:
current = current.left
else:
current = current.right
return False
bst = BST()
bst.insert(3)
bst.insert(1)
bst.insert(5)
print(bst.search(3)) # 输出True
print(bst.search(4)) # 输出False
2、AVL树
AVL树是一种自平衡二叉搜索树,它通过旋转操作来保持树的平衡。其中,旋转操作主要分为四种:左旋、右旋、左右旋和右左旋。下面是对应的代码实现:
# 定义一个AVL节点类
class AVLNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.height = 1
# 定义一个AVL树类
class AVLTree:
def __init__(self):
self.root = None
# 获取节点高度
def getHeight(self, node):
if not node:
return 0
else:
return node.height
# 获取节点平衡因子
def getBalanceFactor(self, node):
if not node:
return 0
else:
return self.getHeight(node.left) - self.getHeight(node.right)
# 右旋
def rightRotate(self, y):
x = y.left
T2 = x.right
x.right = y
y.left = T2
y.height = max(self.getHeight(y.left), self.getHeight(y.right)) + 1
x.height = max(self.getHeight(x.left), self.getHeight(x.right)) + 1
return x
# 左旋
def leftRotate(self, x):
y = x.right
T2 = y.left
y.left = x
x.right = T2
x.height = max(self.getHeight(x.left), self.getHeight(x.right)) + 1
y.height = max(self.getHeight(y.left), self.getHeight(y.right)) + 1
return y
# 插入节点
def insert(self, val):
node = AVLNode(val)
if not self.root:
self.root = node
else:
self.root = self.insertNode(self.root, node)
def insertNode(self, root, node):
if not root:
return node
elif node.val 1 and node.val < root.left.val:
return self.rightRotate(root)
elif balanceFactor root.right.val:
return self.leftRotate(root)
elif balanceFactor > 1 and node.val > root.left.val:
root.left = self.leftRotate(root.left)
return self.rightRotate(root)
elif balanceFactor < -1 and node.val < root.right.val:
root.right = self.rightRotate(root.right)
return self.leftRotate(root)
return root
avl = AVLTree()
avl.insert(3)
avl.insert(1)
avl.insert(5)
print(avl.root.val) # 输出3
图是一种非线性结构,它由顶点(Vertex)和边(Edge)组成,是描述对象之间关系的一种数据结构。常见的图有有向图、无向图、加权图等。
1、无向图BFS
无向图是一种节点之间没有方向的图,它可通过广度优先搜索算法(BFS)来进行遍历。下面是对应的代码实现:
from collections import defaultdict
# 定义一个图类
class Graph:
def __init__(self):
self.graph = defaultdict(list)
# 添加边
def addEdge(self, u, v):
self.graph[u].append(v)
self.graph[v].append(u)
# BFS遍历
def BFS(self, s):
visited = [False] * (max(self.graph) + 1)
queue = []
queue.append(s)
visited[s] = True
while queue:
s = queue.pop(0)
print(s, end=" ")
for i in self.graph[s]:
if visited[i] == False:
queue.append(i)
visited[i] = True
# 定义一个无向图
g = Graph()
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 2)
g.addEdge(2, 0)
g.addEdge(2, 3)
g.addEdge(3, 3)
g.BFS(2) # 输出2 0 3 1
2、有向图DFS
有向图是一种节点之间有方向的图,它可通过深度优先搜索算法(DFS)来进行遍历。下面是对应的代码实现:
# 定义一个有向图类
class DiGraph:
def __init__(self, V):
self.V = V
self.graph = defaultdict(list)
# 添加边
def addEdge(self, u, v):
self.graph[u].append(v)
# DFS遍历
def DFS(self, v, visited):
visited[v] = True
print(v, end=" ")
for i in self.graph[v]:
if visited[i] == False:
self.DFS(i, visited)
# 定义一个有向图
g = DiGraph(4)
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 2)
g.addEdge(2, 0)
g.addEdge(2, 3)
g.addEdge(3, 3)
# 调用DFS算法
visited = [False] * (g.V)
for i in range(g.V):
if visited[i] == False:
g.DFS(i, visited)
排序算法是对无序数据进行排序的一种算法。常见的排序算法有冒泡排序、选择排序、插入排序、归并排序和快速排序等。
1、冒泡排序
冒泡排序(Bubble Sort)是一种通过交换相邻元素的位置来实现排序的算法。下面是对应的代码实现:
def bubbleSort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
arr = [64, 34, 25, 12, 22, 11, 90]
bubbleSort(arr)
print("冒泡排序结果:")
for i in range(len(arr)):
print(arr[i], end=" ")
2、快速排序
快速排序(Quick Sort)是一种比冒泡排序略快的排序算法。它通过递归对数据进行排序,利用分治思想来提高排序的效率。下面是对应的代码实现:
def partition(arr, low, high):
i = low - 1
pivot = arr[high]
for j in range(low, high):
if arr[j] <= pivot:
i = i + 1
arr[i], arr[j] = arr[j], arr[i]
arr[i+1], arr[high] = arr[high], arr[i+1]
return i+1
def quickSort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quickSort(arr, low, pi-1)
quickSort(arr, pi+1, high)
arr = [64, 34, 25, 12, 22, 11, 90]
quickSort(arr, 0, len(arr)-1)
print("快速排序结果:")
for i in range(len(arr)):
print(arr[i], end=" ")
本文从不同方面对Python语言下的数据结构与算法进行了详细的阐述,其中对线性结构、树形结构、图结构和排序算法进行了详细的介绍,并给出了对应的Python代码实现。希望本文能够帮助读者了解数据结构与算法的基本知识,并通过Python语言实现这些算法。