首页 > 编程语言 >python常用的算法

python常用的算法

时间:2024-08-24 16:23:24浏览次数:12  
标签:常用 示例 python graph 复杂度 arr 算法 print 排序

以下是常用的算法及其详细介绍,包括排序算法、查找算法、基础算法和图算法,同时我也会提到每种数据结构的特性、优缺点及使用场景,并给出示例。

一、排序算法

1. 冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法。它通过重复遍历要排序的数列,比较每对相邻元素并交换它们的位置,使较大的元素逐渐“冒泡”到数列的末尾。

特性

  • 逐一比较相邻元素,并将较大的元素向后移动。
  • 最坏时间复杂度:O(n²)
  • 最佳时间复杂度:O(n)(当数组已经有序时)

优缺点

  • 优点:实现简单,适用于小规模数据。
  • 缺点:效率低下,特别是在大规模数据情况下。

示例

def bubble_sort(arr):  
    n = len(arr)  
    # 遍历所有数组元素  
    for i in range(n):  
        # 最后 i 个元素已经排好序  
        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]  
bubble_sort(arr)  
print("排序后的数组:", arr)

2. 选择排序(Selection Sort)

特性

  • 每次选择最小元素,并将其放到已排序数组的末尾。
  • 最坏时间复杂度:O(n²)

优缺点

  • 优点:简单易懂,原地排序。
  • 缺点:同样,在大规模数据时效率低下。

示例

def selection_sort(arr):  
    n = len(arr)  
    for i in range(n):  
        # 假设当前 i 位置是最小值  
        min_idx = i  
        for j in range(i+1, n):  
            if arr[j] < arr[min_idx]:  
                min_idx = j  
        # 交换找到的最小值和当前 i 位置的值  
        arr[i], arr[min_idx] = arr[min_idx], arr[i]  

# 示例  
arr = [64, 25, 12, 22, 11]  
selection_sort(arr)  
print("排序后的数组:", arr)

3. 快速排序(Quick Sort)

特性

  • 选择一个"基准"元素,将数组分割为两个子数组,再递归对这两个子数组进行排序。
  • 最坏时间复杂度:O(n²)(当数组已经有序时)
  • 最好时间复杂度:O(n log n)

优缺点

  • 优点:在平均情况下非常高效,使用递归实现。
  • 缺点:不稳定排序,最坏情况下性能差。

示例

def quick_sort(arr):  
    if len(arr) <= 1:  
        return arr  
    pivot = arr[len(arr) // 2]  # 找到基准值  
    left = [x for x in arr if x < pivot]  # 小于基准值的元素  
    middle = [x for x in arr if x == pivot]  # 等于基准值的元素  
    right = [x for x in arr if x > pivot]  # 大于基准值的元素  
    return quick_sort(left) + middle + quick_sort(right)  

# 示例  
arr = [3, 6, 8, 10, 1, 2, 1]  
sorted_arr = quick_sort(arr)  
print("排序后的数组:", sorted_arr)

4. 归并排序(Merge Sort)

特性

  • 使用分治法,将数组分解为子数组,递归排序后再合并。
  • 时间复杂度:O(n log n)

优缺点

  • 优点:稳定排序,适合大的数据集。
  • 缺点:额外空间复杂度较高。

示例

def merge_sort(arr):  
    if len(arr) <= 1:  
        return arr  
    mid = len(arr) // 2  # 找到中间索引  
    left = merge_sort(arr[:mid])  # 排序左半部分  
    right = merge_sort(arr[mid:])  # 排序右半部分  
    return merge(left, right)  

def merge(left, right):  
    result = []  
    i = j = 0  
    while i < len(left) and j < len(right):  
        if left[i] < right[j]:  
            result.append(left[i])  
            i += 1  
        else:  
            result.append(right[j])  
            j += 1  
    result.extend(left[i:])  
    result.extend(right[j:])  
    return result  

# 示例  
arr = [38, 27, 43, 3, 9, 82, 10]  
sorted_arr = merge_sort(arr)  
print("排序后的数组:", sorted_arr)

二、查找算法

1. 线性查找(Linear Search)

特性

  • 顺序遍历数组中的每个元素。
  • 时间复杂度:O(n)

优缺点

  • 优点:可以用于未排序的数据。
  • 缺点:效率低下。

示例

def linear_search(arr, target):  
    for i in range(len(arr)):  
        if arr[i] == target:  
            return i  
    return -1  

# 示例  
arr = [10, 20, 30, 40, 50]  
target = 30  
index = linear_search(arr, target)  
print("目标元素的索引:", index)

2. 二分查找(Binary Search)

特性

  • 在已排序数组中,通过对半查找来定位目标元素。
  • 时间复杂度:O(log n)

优缺点

  • 优点:效率高,只适用于已排序的数据。
  • 缺点:实现复杂些。

示例

def binary_search(arr, target):  
    left, right = 0, len(arr) - 1  
    while left <= right:  
        mid = left + (right - left) // 2  # 找到中间索引  
        if arr[mid] == target:  
            return mid  
        elif arr[mid] < target:  
            left = mid + 1  
        else:  
            right = mid - 1  
    return -1  

# 示例  
arr = [2, 3, 4, 10, 40]  
target = 10  
index = binary_search(arr, target)  
print("目标元素的索引:", index)

三、基础算法

1. 递归(Recursion)

特性

  • 问题的解由小问题的解构成,函数调用自身。

优缺点

  • 优点:代码简洁,逻辑清晰。
  • 缺点:可能导致栈溢出,效率低于迭代。

示例(阶乘计算)

def factorial(n):  
    if n == 0 or n == 1:  # 基本情况  
        return 1  
    else:  
        return n * factorial(n - 1)  # 递归调用  

# 示例  
print("5 的阶乘:", factorial(5))

2. 动态规划(Dynamic Programming)

特性

  • 用于解决具有重叠子问题和最优子结构的问题。
  • 通过保存中间结果避免重复计算。

优缺点

  • 优点:高效解决多种问题。
  • 缺点:实现复杂,需额外空间存储中间结果。

示例(斐波那契数列)

def fibonacci(n, memo={}):  
    if n in memo:  # 记忆化  
        return memo[n]  
    if n <= 1:  
        return n  
    memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)  
    return memo[n]  

# 示例  
print("第10个斐波那契数:", fibonacci(10))

四、图算法

1. 深度优先搜索(Depth-First Search, DFS)

特性

  • 从一个节点开始,沿着节点的深度探索。

优缺点

  • 优点:实现简单,用于解决某些特殊问题。
  • 缺点:可能导致栈溢出。

示例

def dfs(graph, start, visited=None):  
    if visited is None:  
        visited = set()  
    visited.add(start)  
    print(start, end=" ")  # 访问节点  
    for neighbor in graph[start]:  
        if neighbor not in visited:  
            dfs(graph, neighbor, visited)  

# 示例  
graph = {  
    'A': ['B', 'C'],  
    'B': ['D', 'E'],  
    'C': ['F'],  
    'D': [],  
    'E': [],  
    'F': []  
}  
print("深度优先搜索结果:")  
dfs(graph, 'A')

2. 广度优先搜索(Breadth-First Search, BFS)

特性

  • 从一个节点开始,逐层探索邻接节点。

优缺点

  • 优点:找到最短路径(在无权图中)。
  • 缺点:需要更多的空间存储队列。

示例

from collections import deque  

def bfs(graph, start):  
    visited = set()  
    queue = deque([start])  # 使用双端队列实现队列  
    while queue:  
        vertex = queue.popleft()  # 访问队列的左端  
        if vertex not in visited:  
            print(vertex, end=" ")  
            visited.add(vertex)  
            queue.extend(neighbor for neighbor in graph[vertex] if neighbor not in visited)  

# 示例  
print("\n广度优先搜索结果:")  
bfs(graph, 'A')

3. 最短路径算法(Dijkstra算法)

特性

  • 用于寻找一个节点到其他所有节点的最短路径。
  • 时间复杂度:O(V²)(V为节点数,使用优先队列可降至O(E log V))

优缺点

  • 优点:处理带权图的最短路径问题。
  • 缺点:无法处理负权边。

示例

import heapq  

def dijkstra(graph, start):  
    # 初始化距离字典  
    distances = {vertex: float('infinity') for vertex in graph}  
    distances[start] = 0  
    priority_queue = [(0, start)]  # (距离, 节点)  
    
    while priority_queue:  
        current_distance, current_vertex = heapq.heappop(priority_queue)  

        # 如果当前距离大于已知距离,跳过  
        if current_distance > distances[current_vertex]:  
            continue  

        for neighbor, weight in graph[current_vertex].items():  
            distance = current_distance + weight  
            
            # 仅在找到更短的距离时更新优先队列和最短路径  
            if distance < distances[neighbor]:  
                distances[neighbor] = distance  
                heapq.heappush(priority_queue, (distance, neighbor))  
    
    return distances  

# 示例图  
graph = {  
    'A': {'B': 1, 'C': 4},  
    'B': {'A': 1, 'C': 2, 'D': 5},  
    'C': {'A': 4, 'B': 2, 'D': 1},  
    'D': {'B': 5, 'C': 1}  
}  

print("\n从 A 到所有其他节点的最短路径:")  
print(dijkstra(graph, 'A'))

其他算法和数据结构

1. 哈希表 (Hash Table)

哈希表是一种用键值对存储数据的结构,支持快速的插入、查找和删除。

特性
  • 时间复杂度:O(1)(平均)
  • 空间复杂度:O(n)
  • 使用场景:快速查找
示例
# 示例:使用字典作为哈希表
hash_table = {}

# 插入数据
hash_table['apple'] = 1
hash_table['banana'] = 2

# 查找数据
print("apple 的值:", hash_table.get('apple'))  # 输出 1

2. 树 (Tree)

树是一种非线性数据结构,由节点组成,适合表示层级关系。

特性
  • 时间复杂度:O(log n)(在平衡树中)
  • 空间复杂度:O(n)
  • 使用场景:表示层级结构,如文件系统等

3. 堆 (Heap)

堆是一种特殊的树形数据结构,用于实现优先队列。

特性
  • 时间复杂度:插入 O(log n),查找 O(1)
  • 空间复杂度:O(n)
  • 使用场景:任务调度、图算法等

4. AVL树 (AVL Tree)

AVL树是自平衡的二叉搜索树,确保插入和删除操作的复杂度保持在 O(log n)。

5. 红黑树 (Red-Black Tree)

红黑树是一种自平衡的二叉搜索树,允许快速的插入、删除和查找操作。

标签:常用,示例,python,graph,复杂度,arr,算法,print,排序
From: https://blog.csdn.net/m0_54490473/article/details/141334737

相关文章

  • Python爬虫案例二:获取虎牙主播图片(动态网站)
    爬虫流程:优先假设是JSON数据,抓包方式只能翻页JSON数据HTML数据1.异步数据(即先返回HTML,再返回目标的数据,只是触发了JSON请求),不在HTML中2.不能刷新网页,直接翻页测试链接:https://live.huya.com/源代码: importrequests,json,osclassTwo(object):def__ini......
  • 豆瓣评分8.6!Python社区出版的Python故事教程,太强了!
    Python是活力四射的语言,是不断发展中的语言。就连使用Python多年的行者也不敢说对Python的方方面面都了解并可以自由运用,想必读者可能更加无法快速掌握所有重点技巧了。今天给小伙伴们分享的这份手册是用互动的开发故事来探讨Pyfhonic开发的故事书籍,是一本Python语言详解......
  • 豆瓣评分9.0!Python3网络爬虫开发实战,堪称教学典范!
    今天我们所处的时代是信息化时代,是数据驱动的人工智能时代。在人工智能、物联网时代,万物互联和物理世界的全面数字化使得人工智能可以基于这些数据产生优质的决策,从而对人类的生产生活产生巨大价值。在这个以数据驱动为特征的时代,数据是最基础的。数据既可以通过研发产品获得,......
  • GitHub星标破万!Python学习教程(超详细),真的太强了!
    Python是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。Python的设计哲学之一就是简单易学,体现在两个方面:语法简洁明了:相对Ruby和Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。切入点很多:Python可以让你可以做很多事情,科学计算和数据......
  • Python爬虫案例一:获取古诗文并按用户输入的作者名进行数据保存
    前言:1、什么是爬虫?也称为网页蜘蛛(WebSpider),通俗来说,解放人的双手,去互联网获取数据,以数据库,txt,excel,csv,pdf,压缩文件,image,video,music保存数据。本质:模拟浏览器,向服务器发送网络请求,接受服务器返回的数据,并保存数据。2、爬虫的分类?A......
  • LeetCode-Python-1650. 二叉树的最近公共祖先 III
    给定一棵二叉树中的两个节点 p 和 q,返回它们的最近公共祖先节点(LCA)。每个节点都包含其父节点的引用(指针)。Node 的定义如下:classNode{publicintval;publicNodeleft;publicNoderight;publicNodeparent;}根据维基百科中对最近公共祖先节点......
  • 力扣热题100_贪心算法_55_跳跃游戏
    文章目录题目链接解题思路解题代码题目链接55.跳跃游戏给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。示例1:输入:nums=[......
  • MAC 查看是否安装 Python
    在Mac上查看是否安装了Python以及安装的版本,你可以通过终端(Terminal)来执行一些简单的命令。以下是几种常用的方法:方法1:使用python或python3命令打开终端(Terminal)。输入python--version或python3--version(取决于你的系统配置和Python的安装方式),然后回车。如果系统返......
  • 基于python+flask框架的鞋子购物系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的普及,线上购物已成为人们日常生活中不可或缺的一部分。鞋类作为时尚与舒适并重的消费品,其市场需求持......
  • 基于python+flask框架的假期托管服务管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会节奏的加快和家庭结构的变化,双职工家庭及单亲家庭对于儿童假期托管的需求日益增长。传统的家庭照看模式已难以满足现代家庭对于孩......