📜  数据结构和算法 |设置 9(1)

📅  最后修改于: 2023-12-03 15:26:09.663000             🧑  作者: Mango

数据结构和算法 | 设置 9

本介绍旨在向程序员介绍数据结构和算法,并为他们提供基本知识和技能,以便他们能够理解和应用它们。

数据结构

在计算机科学中,数据结构是指组织数据的方式。它涉及到如何存储、操作、管理和使用数据。数据结构的选择对程序的性能和可维护性有很大的影响。以下是几个常见的数据结构:

数组

数组是一种简单的数据结构,它由一组相同类型的元素组成。元素在内存中是连续存储的,可以通过索引访问。数组的大小是固定的,一旦创建,大小就不能改变。

# 创建一个整数类型的数组,包含5个元素
arr = [0] * 5
链表

链表是一种动态的数据结构,它由一系列节点组成。每个节点包含数据和指向下一个节点的指针。链表的大小可以动态改变,因为要添加或删除元素时只需修改指针。链表的缺点是访问元素时需要遍历整个链表,最坏情况下的时间复杂度是 O(n)。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
        
# 创建一个包含1, 2, 3的链表
head = ListNode(1, ListNode(2, ListNode(3)))

栈是一种后进先出(LIFO)的数据结构。栈中的元素只能通过栈顶添加或删除。栈通常采用数组或链表实现。

class Stack:
    def __init__(self):
        self.stack = []
        
    def push(self, x):
        self.stack.append(x)
        
    def pop(self):
        if not self.empty():
            return self.stack.pop()
        
    def peak(self):
        if not self.empty():
            return self.stack[-1]
        
    def empty(self):
        return len(self.stack) == 0
队列

队列是一种先进先出(FIFO)的数据结构。元素只能通过队列的后端添加,前端删除。队列通常也采用数组或链表实现。

class Queue:
    def __init__(self):
        self.queue = []
        
    def push(self, x):
        self.queue.append(x)
        
    def pop(self):
        if not self.empty():
            return self.queue.pop(0)
        
    def front(self):
        if not self.empty():
            return self.queue[0]
        
    def empty(self):
        return len(self.queue) == 0
算法

算法是指解决问题的步骤和过程。和数据结构一样,算法的效率也影响程序的性能。以下是几个常见的算法:

排序

排序是指将一组数据按照某种方式先后排序。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。其中,快速排序和归并排序的时间复杂度是 O(nlogn),是常用的排序算法。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    
    pivot = arr[0]
    left = [x for x in arr[1:] if x < pivot]
    right = [x for x in arr[1:] if x >= pivot]
    
    return quick_sort(left) + [pivot] + quick_sort(right)
查找

查找是指在一组数据中查找指定元素的过程。常见的查找算法包括线性查找和二分查找。二分查找的时间复杂度是 O(logn),是常用的查找算法。

def binary_search(arr, target):
    low, high = 0, len(arr) - 1
    
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
            
    return -1
动态规划

动态规划是一种解决多阶段决策过程最优化问题的方法。常见的动态规划问题包括背包问题、最长公共子序列问题等。动态规划的时间复杂度是 O(n^2),但通过优化可以达到 O(n)。

def knapsack(capacity, weights, values):
    n = len(weights)
    dp = [0] * (capacity + 1)
    
    for i in range(n):
        for j in range(capacity, weights[i] - 1, -1):
            dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
            
    return dp[capacity]
总结

本文介绍了数据结构和算法,并提供了基本的实现代码。程序员应该熟悉这些概念和实现方式,以提高代码质量、效率和可读性。