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語言實現這些算法。