Python高级算法与数据结构优化实战
Python高级算法与数据结构优化实战
在算法竞赛中,掌握高级优化技巧和数据结构实现可以显著提升解题效率和代码性能。本文深入探讨Python中常见算法问题的高效实现方法,通过实际比赛案例展示如何优化时间复杂度和空间复杂度。
一、前缀和与差分数组
前缀和与差分数组是算法竞赛中处理区间查询和修改的利器,能将时间复杂度从O(n)降至O(1)。
1.1 前缀和技术
基本实现:
def build_prefix_sum(nums):n = len(nums)prefix = [0] * (n + 1)for i in range(n):prefix[i + 1] = prefix[i] + nums[i]return prefixdef range_sum(prefix, left, right):# 返回nums[left]到nums[right-1]的和return prefix[right] - prefix[left]
实战应用: 矩阵区域和
题目: 计算二维矩阵中任意子矩阵的元素和。
def matrix_region_sum(matrix):if not matrix or not matrix[0]:return []m, n = len(matrix), len(matrix[0])# 构建二维前缀和prefix = [[0] * (n + 1) for _ in range(m + 1)]for i in range(m):for j in range(n):prefix[i + 1][j + 1] = prefix[i + 1][j] + prefix[i][j + 1] - prefix[i][j] + matrix[i][j]# 查询函数: 返回(row1,col1)到(row2,col2)矩形区域的和def query(row1, col1, row2, col2):return prefix[row2 + 1][col2 + 1] - prefix[row2 + 1][col1] - prefix[row1][col2 + 1] + prefix[row1][col1]return query# 示例
matrix = [[3, 0, 1, 4, 2],[5, 6, 3, 2, 1],[1, 2, 0, 1, 5],[4, 1, 0, 1, 7],[1, 0, 3, 0, 5]
]region_sum = matrix_region_sum(matrix)
print(region_sum(1, 1, 3, 3)) # 矩阵中(1,1)到(3,3)区域的和: 6+3+2+0+1
高级应用: 子数组和为k的个数
题目: 给定一个数组和整数k,求数组中和为k的连续子数组个数。
from collections import defaultdictdef subarray_sum_equals_k(nums, k):count = 0prefix_sum = 0# 前缀和出现次数的哈希表prefix_count = defaultdict(int)prefix_count[0] = 1 # 空前缀for num in nums:prefix_sum += num# 如果prefix_sum - k在哈希表中,说明存在前缀和为k的子数组count += prefix_count[prefix_sum - k]prefix_count[prefix_sum] += 1return count# 示例
nums = [1, 1, 1]
k = 2
print(subarray_sum_equals_k(nums, k)) # 输出: 2
1.2 差分数组技术
差分数组是前缀和的逆运算,常用于区间更新操作。
基本实现:
def build_difference_array(nums):n = len(nums)diff = [0] * ndiff[0] = nums[0]for i in range(1, n):diff[i] = nums[i] - nums[i - 1]return diffdef range_add(diff, left, right, val):# 将nums[left]到nums[right]的元素都加上valdiff[left] += valif right + 1 < len(diff):diff[right + 1] -= valdef reconstruct_array(diff):n = len(diff)nums = [0] * nnums[0] = diff[0]for i in range(1, n):nums[i] = nums[i - 1] + diff[i]return nums
实战应用: 航班预订统计
题目: 有n个航班,航班编号从1到n。有多个预订记录,每个记录包含(first, last, seats),表示从first到last号航班预订了seats个座位。求每个航班预订的座位总数。
def corporate_flight_bookings(bookings, n):# 初始化差分数组diff = [0] * (n + 1)# 处理预订记录for first, last, seats in bookings:diff[first - 1] += seats # 注意索引从0开始diff[last] -= seats # 结束后恢复# 还原原始数组result = [0] * nresult[0] = diff[0]for i in range(1, n):result[i] = result[i - 1] + diff[i]return result# 示例
bookings = [[1, 2, 10], [2, 3, 20], [2, 5, 25]]
n = 5
print(corporate_flight_bookings(bookings, n)) # 输出: [10, 55, 45, 25, 25]
二、并查集(Union-Find)
并查集是处理元素分组和合并操作的高效数据结构,广泛应用于图论问题。
2.1 并查集的高效实现
class UnionFind:def __init__(self, n):self.parent = list(range(n))self.rank = [0] * n # 按秩合并优化self.count = n # 连通分量数def find(self, x):if self.parent[x] != x:# 路径压缩self.parent[x] = self.find(self.parent[x])return self.parent[x]def union(self, x, y):root_x = self.find(x)root_y = self.find(y)if root_x == root_y:return False# 按秩合并if self.rank[root_x] < self.rank[root_y]:self.parent[root_x] = root_yelif self.rank[root_x] > self.rank[root_y]:self.parent[root_y] = root_xelse:self.parent[root_y] = root_xself.rank[root_x] += 1self.count -= 1return Truedef connected(self, x, y):return self.find(x) == self.find(y)
实战应用: 岛屿数量问题
题目: 给定一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格,计算岛屿的数量。
def num_islands(grid):if not grid or not grid[0]:return 0m, n = len(grid), len(grid[0])uf = UnionFind(m * n)# 将水域标记为已访问land_count = 0for i in range(m):for j in range(n):if grid[i][j] == '1':land_count += 1else:# 水域节点的父节点设为一个特殊值uf.parent[i * n + j] = -1# 方向数组: 右、下directions = [(0, 1), (1, 0)]# 合并相邻的陆地for i in range(m):for j in range(n):if grid[i][j] == '1':current = i * n + j# 检查右边和下边的相邻节点for dx, dy in directions:ni, nj = i + dx, j + dyif 0 <= ni < m and 0 <= nj < n and grid[ni][nj] == '1':neighbor = ni * n + njuf.union(current, neighbor)# 计算连通分量数量islands = 0for i in range(m * n):if uf.parent[i] != -1 and uf.find(i) == i:islands += 1return islands# 示例
grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]
]
print(num_islands(grid)) # 输出: 3
高级应用: 最小生成树的Kruskal算法
def kruskal_mst(n, edges):"""Kruskal算法求最小生成树n: 节点数edges: 边列表 [(u, v, weight)]返回: 最小生成树的总权重"""# 按权重排序edges.sort(key=lambda x: x[2])uf = UnionFind(n)mst_weight = 0mst_edges = []for u, v, weight in edges:if uf.union(u, v): # 如果合并成功(不会形成环)mst_weight += weightmst_edges.append((u, v, weight))# 如果已经找到n-1条边,说明最小生成树已完成if len(mst_edges) == n - 1:breakreturn mst_weight, mst_edges# 示例
edges = [(0, 1, 10), (0, 2, 6), (0, 3, 5),(1, 3, 15), (2, 3, 4)
]
n = 4
weight, mst = kruskal_mst(n, edges)
print(f"最小生成树权重: {weight}")
print(f"最小生成树边: {mst}")
三、线段树与树状数组
线段树和树状数组是处理区间查询和区间修改的高级数据结构。
3.1 树状数组(Binary Indexed Tree)
树状数组在O(log n)时间内完成单点更新和前缀和查询。
class BinaryIndexedTree:def __init__(self, n):self.size = nself.tree = [0] * (n + 1) # 索引从1开始def update(self, index, delta):"""更新单个元素"""while index <= self.size:self.tree[index] += deltaindex += (index & -index) # 加上最低位的1def query(self, index):"""查询前缀和: 从1到index的元素和"""result = 0while index > 0:result += self.tree[index]index -= (index & -index) # 减去最低位的1return resultdef range_query(self, left, right):"""查询区间和: 从left到right的元素和"""return self.query(right) - self.query(left - 1)
实战应用: 逆序对计数
题目: 计算一个数组中的逆序对数量。逆序对是指数组中的两个元素,前面的元素大于后面的元素。
def count_inversions(nums):# 离散化: 将数组中的元素映射到1到nsorted_nums = sorted(set(nums))rank = {val: idx + 1 for idx, val in enumerate(s相关文章:
Python高级算法与数据结构优化实战
Python高级算法与数据结构优化实战 在算法竞赛中,掌握高级优化技巧和数据结构实现可以显著提升解题效率和代码性能。本文深入探讨Python中常见算法问题的高效实现方法,通过实际比赛案例展示如何优化时间复杂度和空间复杂度。 一、前缀和与差分数组 前缀和与差分数组是算法…...
使用 Excel 实现绩效看板的自动化
引言 在日常工作中,团队的绩效监控和管理是确保项目顺利进行的重要环节。然而,面临着以下问题: 数据分散:系统中的数据难以汇总,缺乏一个宏观的团队执行情况视图。看板缺失:系统本身可能无法提供合适…...
Tomcat新手登峰指南:从零到部署的原子化实践
开篇:为什么选择Tomcat? 2024年StackOverflow调查显示,Tomcat以68.9%占有率蝉联Java Web服务器榜首。但新手常陷入三大误区: 直接使用IDE内置Tomcat导致生产环境配置失准权限配置不当引发安全漏洞内存参数未优化造成性能瓶颈 本…...
vue3怎么和大模型交互?
引言 平时我们都是用的在线的AI工具,直接输入问题,然后AI回答我们,那么怎么把AI接入项目中呢? 这个问题问得好。 方案一:引入第三方已封装好的UI库方案二:自己写 对于方案一,市面上已有一些…...
【网络编程】HTTP网络编程
13.1 HTTP 简介 HTTP(Hyper Text Transfer Protocol,超文本传输协议)是用于从万维网(WWW:World Wide Web) 服务器(简称Web 服务器)传输超文本到本地浏览器的传送协议,基于TCP/IP 通信协 议来传递数据 (HTML 文件、图片文件、查询结果等)。 13.2 HTTP 的工作原理 …...
【Qt】QWidget属性介绍
🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 前言1. enabled属性2.geometry属性2.1 改变控件位置2.2 女神表白程序2.3 知识补充——window frame 3. windowsTitle属性4. windowIcon属性…...
『Rust』Rust运行环境搭建
文章目录 rust编译工具rustupVisual Studio VS Code测试编译手动编译VSCode编译配置 参考完 rust编译工具rustup https://www.rust-lang.org/zh-CN/tools/install 换源 RUSTUP_DIST_SERVER https://rsproxy.cn RUSTUP_UPDATE_ROOT https://rsproxy.cn修改rustup和cargo的安…...
vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮
如果你是vite项目,直接写一个vite的插件,通过这个插件可以动态注入环境变量,然后当打包的时候,自动注入这个时间到环境变量中,然后在项目中App.vue中或者Main.tsx中打印出来,这就知道是什么时候编译的项目了…...
基于大模型的上睑下垂手术全流程预测与方案优化研究报告
目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 研究方法与创新点 二、上睑下垂相关理论基础 2.1 上睑下垂的定义与分类 2.2 发病机制与影响 2.3 传统治疗方法概述 三、大模型技术原理与应用 3.1 大模型概述 3.2 在医疗领域的应用现状 3.3 用于上睑下垂预测的…...
Cadence学习笔记3
设置 PCB 层叠 初始我们有一个两层板,如果需要添加层叠怎么办? 点击进入层叠设置 首先右击 TOP 层下面的空白,然后鼠标右键进行 add layer 然后选择 Plane(一般层就是这个) 就好 然后 add就行 设置光标显示形式 在 setup ->…...
Linux系统下如何部署svmspro平台
上传svmspro服务 rz回车后选择svmspro.zip上传如果提示rz命令未找到,请先运行 yum install -y lrzsz 安装将svmspro.zip解压出来,并拷贝到/usr/目录下,命令如下: unzip svmspro.zip//解压程序包cp svmspro /usr/ -r//将svmspro文件…...
vue3:八、登录界面实现-忘记密码
一、页面效果 二、实现 1、视图层 <el-form-item class"flex flex-between"><el-checkbox label"记住密码" v-model"remember" /> </el-form-item> 参考 Checkbox 多选框 | Element Plus 2、逻辑层 首先设置记住密码的变…...
el-table树形表格合并相同的值
el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …...
Apache Tomcat漏洞,对其进行升级
我们付出一些成本,时间的或者其他,最终总能收获一些什么。 升级背景: 近日,新华三盾山实验室监测到 Apache 官方修复了一个远程代码执行漏洞 (CVE-2025-24813) ,其CVSS3 漏洞评分为 7.5 。 影响范围 9.0.0.M1 ≤…...
工程实践:如何使用SU17无人机来实现室内巡检任务
阿木实验室最近发布了科研开发者版本的无人机SU17,该无人机上集成了四目视觉,三维激光雷达,云台吊舱,高算力的机载计算机,是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…...
时序优化学习笔记
0.代码对应的底层调用 if-else的判定条件需要LUT实现,累加器的进位需要靠CARRY实现。 1.逻辑级数的概念 简单来讲就是组合逻辑串联的个数 逻辑级数查询命令 report_design_analysis -logic_level_distribution -logic_level_dist_paths 5000 -name design_analy…...
OSPF-3 1类LSA Router LSA
前面两期我们介绍了OSPF的邻居与邻接建立的关系及失败因素和原因 这章我们来说说OSPF是如何通过不同的LSA去描述拓扑的信息以及路由信息 一、概述 OSPF通过不同的LSA来构成LSDB链路状态数据库,再通过SPF算法来计算出最优的最短路径 二、LSA的分类 类型名称描述传播范围1类…...
纳米压印技术制备AR眼镜的参考步骤
纳米压印技术(Nanoimprint Lithography, NIL)在 AR(增强现实)眼镜中的应用主要集中在光学元件的制造上,例如衍射光栅、波导和微透镜阵列等。以下是使用纳米压印技术制备 AR 眼镜光学元件的详细步骤: 1. 设…...
FX-std::list
std::list 是 C 标准库中的一个双向链表容器,定义在 <list> 头文件中。它支持在任意位置高效地插入和删除元素,但不支持随机访问。以下是 std::list 的基本用法和一些常见操作: 1. 包含头文件 #include <list> 2. 定义和初始化…...
【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)
我用夸克网盘分享了「DeepSeek完整资料合集」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/621259e4af15 近日,清华大学发布了《…...
HCIA-ACL实验
前提条件:实现底层互通 转发层面 1、基本ACL ①要求PC3不能访问网段192.168.2.0的网段,PC4和客户端能正常访问服务器 ②AR2配置 acl 2000 rule deny source 192.168.1.1 0 匹配流量 int g 0/0/0 traffic-filter inbound acl 2000 接口调用…...
【Gee】项目总结:模仿 GIN 实现简单的 Golang Web 框架
文章目录 Gee 项目回顾Gee 项目总结Golang 已经具备基础的 web 功能,为什么还需要 web 框架?作为 web 框架,Gee 框架完成了哪些功能?如何用 Gee 来构建 web 项目? Gee 项目回顾 上个月月末我按照 Geektutu 的教程&…...
DeepLabv3+改进10:在主干网络中添加LSKBlock|动态调整其大型空间感受野,助力小目标识别
🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…...
词向量:优维大模型语义理解的深度引擎
★ 放闸溯源 优维大模型「骨架级」技术干货 第二篇 ⇓ 词向量是Transformer突破传统NLP技术瓶颈的核心,它通过稠密向量空间映射,将离散符号转化为连续语义表示。优维大模型基于词向量技术,构建了运维领域的“语义地图”,实现从…...
编译原理:语法分析程序【附源码和超详细注释】
目录 一 、实验目的 二 、实验内容及步骤 三、程序分析 1. 需求分析 2. 功能分析 1. LL(1)文法功能分析 2. 算符优先文法功能分析 3. 信创分析-主要针对能力提升中国产操作系统上开发内容。 四、源代码 1. LL(1)文法代码 2. 算符优先文法 五、测试结果 1. LL(1)文…...
Go vs Rust vs C++ vs Python vs Java:谁主后端沉浮
一、核心性能对比(基于TechEmpower基准测试) 语言单核QPS延迟(ms)内存消耗适用场景Rust650,0000.1245MB高频交易/区块链C++720,0000.0932MB游戏服务器/实时渲染Go230,0000.45110MB微服务/API网关Java180,0001.2450MB企业ERP/银行系统Python12,0008.5220MBAI接口/快速原型技术…...
使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示
使用 Python 和 OpenCV 实现树莓派与客户端的视频流传输与显示 在计算机视觉和物联网领域,经常需要将树莓派作为视频流服务器,通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库ÿ…...
fs的proxy_media模式失效
概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在fs的使用过程中,某些场景只需要对rtp媒体做透传,又不需要任何处理。 在fs1.6的版本中,我们可以使用proxy_media来代理媒体的转发,媒体的协商由AB路端对端处理ÿ…...
Linux 命名管道
文章目录 🚀 深入理解命名管道(FIFO)及其C实现一、命名管道核心特性1.1 🧩 基本概念 二、💻 代码实现解析2.1 📁 公共头文件(common.hpp)2.2 🖥️ 服务器端(s…...
HDU 学数数导致的
题目解析 首先,数对是有序的,<1,2>和<2,1>被视为不同的两组数字。 其次,数对<p,q>的p和q可以相等。 子序列为 p 0 p q,观察到,中间要出现一个0。那么,我们只需要找到第一个 p 满足与前…...
