Python語言版的數據結構與算法

T79SS 數碼 6

這篇文章將從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語言實現這些算法。

回復

共1條回復 我來回復
  • 暫無回復內容