惊!Python算法界的三大神器:分治法、贪心算法、动态规划,让你秒变算法大师!

简介: 【7月更文挑战第8天】在Python编程中,分治、贪心和动态规划是核心算法。分治如归并排序,将大问题拆解并递归求解;贪心算法针对找零问题,每次都选最大面额硬币,追求局部最优;动态规划则通过记忆化避免重复计算,如斐波那契数列。这些算法巧妙地提升效率,解决复杂问题。

在编程的浩瀚星空中,算法无疑是那最耀眼的星辰,引领着技术创新的方向。而在Python的算法界,分治法、贪心算法、动态规划被誉为三大神器,它们各自以其独特的魅力,帮助无数开发者解决了复杂问题,提升了程序的效率与性能。今天,就让我们通过几个生动的案例分析,一窥这三大神器的奥秘,让你秒变算法大师!

分治法:化繁为简的艺术
分治法,顾名思义,就是将一个复杂的问题分解成若干个简单的子问题来解决,然后合并子问题的解以得到原问题的解。其精髓在于“分而治之”。

案例分析:归并排序
归并排序是分治法的一个经典应用。它将数组分成两半,分别对它们进行排序,然后将结果合并成一个有序数组。

python
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2 # 找到中间位置
L = arr[:mid] # 分割数组
R = arr[mid:]

    merge_sort(L)  # 递归排序左半部分  
    merge_sort(R)  # 递归排序右半部分  

    i = j = k = 0  

    # 合并两个有序数组  
    while i < len(L) and j < len(R):  
        if L[i] < R[j]:  
            arr[k] = L[i]  
            i += 1  
        else:  
            arr[k] = R[j]  
            j += 1  
        k += 1  

    # 复制剩余元素  
    while i < len(L):  
        arr[k] = L[i]  
        i += 1  
        k += 1  

    while j < len(R):  
        arr[k] = R[j]  
        j += 1  
        k += 1  

示例

arr = [12, 11, 13, 5, 6, 7]
merge_sort(arr)
print("Sorted array is:", arr)
贪心算法:局部最优即是全局最优?
贪心算法总是做出在当前看来最好的选择,它希望通过局部最优的选择来达到全局最优。虽然贪心算法不保证总是能得到全局最优解,但在很多情况下,它的效率和效果都非常出色。

案例分析:找零钱问题
假设你是一家商店的收银员,需要给顾客找零n元,你手头有各种面额的硬币(如1元、5元、10元等),如何用最少的硬币数量完成找零?

python
def coin_change(coins, amount):

# dp[i]表示凑成金额i所需的最少硬币数  
dp = [float('inf')] * (amount + 1)  
dp[0] = 0  

for i in range(1, amount + 1):  
    for coin in coins:  
        if coin <= i:  
            dp[i] = min(dp[i], dp[i - coin] + 1)  

return dp[amount] if dp[amount] != float('inf') else -1  # -1表示无法找零  

示例

coins = [1, 2, 5]
amount = 11
print(coin_change(coins, amount)) # 输出:3
注意:虽然此例使用了动态规划的思路,但贪心算法在处理类似问题时也常被尝试(尽管可能不总是最优解)。

动态规划:记忆化搜索的艺术
动态规划通过将原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而优化算法性能。

案例分析:斐波那契数列
斐波那契数列是一个非常著名的动态规划问题,每个数是前两个数的和。

python
def fibonacci(n):

# 使用一个数组来保存中间结果  
dp = [0] * (n + 1)  
dp[1] = 1  

for i in range(2, n + 1):  
    dp[i] = dp[i - 1] + dp[i - 2]  

return dp[n]  

示例

n = 10
print(fibonacci(n)) # 输出:55
通过这三个案例,我们可以看到分治法、贪心算法和动态规划在解决不同问题时的独特魅力和强大

相关文章
|
11天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
103 66
|
1天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
14 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
23小时前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
8天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
算法 Python
python 实现分治法的几个例子
分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
1337 0
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
20天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
105 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
153 59
|
9天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
30 14