21_动态规划与数据结构结合
菜鸟:老鸟,我最近在处理一个数据操作时遇到了性能问题。我需要计算一个数组中某些子数组的和,但直接计算太慢了,有没有什么更高效的方法?
老鸟:你提到的这个问题其实可以通过动态规划结合数据结构来解决。你听说过动态规划吗?
菜鸟:听说过一些,但不太熟悉。能不能详细讲讲?
老鸟:当然可以。动态规划是一种通过分解问题来减少计算量的技术,它通过记忆化的方式避免重复计算。而当它与合适的数据结构结合时,能大幅提升性能。我们来具体看看吧。
渐进式介绍概念
老鸟:假设你有一个数组 arr,你需要多次查询某个子数组 arr[i:j] 的和。直接计算会很慢,我们可以用动态规划预处理,再用一种数据结构来快速查询。
菜鸟:听起来不错,但具体怎么做呢?
老鸟:我们可以先构建一个数组 prefixSum,其中 prefixSum[i] 表示数组 arr 从起始位置到 i 的和。这样每次查询 arr[i:j] 的和时,可以用 prefixSum[j] - prefixSum[i-1] 来快速计算。
菜鸟:这样确实能减少计算量,但构建 prefixSum 数组需要什么操作呢?
老鸟:好问题。我们来看看代码示例。
代码示例与分析
# 构建prefixSum数组
arr = [1, 2, 3, 4, 5]
prefixSum = [0] * (len(arr) + 1)for i in range(1, len(arr) + 1):prefixSum[i] = prefixSum[i-1] + arr[i-1]# 查询子数组 arr[i:j] 的和
def query_sum(i, j):return prefixSum[j] - prefixSum[i-1]# 示例查询
print(query_sum(2, 4)) # 输出 9
老鸟:在这个代码中,我们首先构建了 prefixSum 数组。构建过程的时间复杂度是 O(n)。然后,每次查询子数组和的时间复杂度是 O(1)。
菜鸟:这样确实比直接计算要快很多。但这个方法在更复杂的场景下也适用吗?
问题与优化
菜鸟:如果我要频繁修改数组中的元素,这个方法还有效吗?每次修改后都要重新构建 prefixSum 数组吗?
老鸟:这是一个好问题。如果数组需要频繁修改,我们可以使用更高级的数据结构,比如线段树或树状数组,它们能在 O(log n) 的时间内更新和查询。
老鸟:我们来看看线段树的例子。
class SegmentTree:def __init__(self, data):self.n = len(data)self.tree = [0] * (2 * self.n)# 构建线段树for i in range(self.n):self.tree[self.n + i] = data[i]for i in range(self.n - 1, 0, -1):self.tree[i] = self.tree[i * 2] + self.tree[i * 2 + 1]def update(self, pos, value):pos += self.nself.tree[pos] = valuewhile pos > 1:pos //= 2self.tree[pos] = self.tree[pos * 2] + self.tree[pos * 2 + 1]def query(self, l, r):l += self.nr += self.nresult = 0while l < r:if l % 2:result += self.tree[l]l += 1if r % 2:r -= 1result += self.tree[r]l //= 2r //= 2return result# 示例使用
data = [1, 2, 3, 4, 5]
seg_tree = SegmentTree(data)
print(seg_tree.query(1, 4)) # 输出 9
seg_tree.update(2, 10)
print(seg_tree.query(1, 4)) # 输出 16
菜鸟:这个线段树的代码看起来复杂一些,但它能在 O(log n) 的时间内完成更新和查询,确实比重新构建 prefixSum 数组更高效。
适用场景与误区
菜鸟:这个方法在实际项目中有什么应用场景吗?
老鸟:当然有,比如在处理大量查询和修改的场景下,线段树和树状数组都非常有用。常见的应用包括区间和查询、区间最大最小值查询等。
菜鸟:有没有什么常见的误区需要注意?
老鸟:常见的误区是忽略了空间复杂度。虽然线段树和树状数组在时间复杂度上有优势,但它们的空间复杂度一般是 O(n),需要额外的存储空间。另外,选择合适的数据结构也很重要,不同的数据结构在不同场景下有不同的优势。
总结与延伸阅读
老鸟:今天我们讨论了动态规划与数据结构结合的应用,通过 prefixSum 数组和线段树的例子,了解了如何高效地进行区间和查询和更新。希望这些内容对你有帮助。
菜鸟:非常有帮助!我会继续学习这些数据结构,并在实际项目中尝试应用。你能推荐一些延伸阅读的资源吗?
老鸟:当然可以。你可以参考《算法导论》和《编程珠玑》这两本书,里面有很多关于动态规划和数据结构的详细介绍。
相关文章:
21_动态规划与数据结构结合
菜鸟:老鸟,我最近在处理一个数据操作时遇到了性能问题。我需要计算一个数组中某些子数组的和,但直接计算太慢了,有没有什么更高效的方法? 老鸟:你提到的这个问题其实可以通过动态规划结合数据结构来解决。…...
React与Vue的对比
异同总结 相同点: 都有组件化思想 都支持服务器端渲染 都有Virtual DOM(虚拟dom) 数据驱动视图 都有支持native的方案:Vue的weex、React的React native 都有自己的构建工具:Vue的vue-cli、React的Create React A…...
精密量测软件(仿KLA免费浏览器程序ProfilmOnline)
KLA在线软件分析图 软件仿KLA公司免费浏览器软件ProfilmOnline,软件地址ProfilmOnline - 用于3D轮廓仪和AFM的表面成像、分析和测量软件 可以直接从profilmonline上下载3D图加载对比分析,当前已完成的内容有 1、调平 2、尖峰去噪 3、能量密度图&…...
Java项目: 基于SpringBoot+mybatis+maven实现的IT技术交流和分享平台(含源码+数据库+毕业论文)
一、项目简介 本项目是一套基于SpringBootmybatismaven实现的IT技术交流和分享平台 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美…...
STL02——手写简单版本的list
手写一个简单版本的list 设计一个名为 List 的 List 类,该类具有以下功能和特性: 1、基础成员函数 构造函数:初始化 List 实例析构函数:清理资源,确保无内存泄露 2、核心功能 在 List 末尾添加元素在 List 开头添…...
基于SpringBoot的校园自助洗衣服务管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园自助洗衣服务…...
音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件
在文章《音视频入门基础:PCM专题(1)——使用FFmpeg命令生成PCM音频文件并播放》中讲述了生成PCM文件的方法。通过FFmpeg命令可以把该PCM文件转为AAC裸流文件: ./ffmpeg -f s16le -ar 44100 -ac 2 -i audio1.pcm audio1.aac 由于…...
第 6 篇 自定义 Helm Chart
文章目录 第 1 步:创建 chartChart.yamlvalues.yamltemplates 模板文件_helpers.tpl 模板辅助文件serviceaccount.yamlservice.yamldeployment.yamlhpa.yamlingress.yamlNOTES.txttests/test-connection.yaml 第 2 步:检查 chart 格式第 3 步:…...
Jenkis部署vue前端项目提示:sh: vue-cli-service: command not found
解决方法: 1. 进入到/var/lib/jenkins/workspace/项目名下,查看是否有node_modules,如果没有执行 npm install 2. 如果执行npm intall的过程中提示:npm ERR! 407 Proxy Authentication Required - GET http://registry.npm.taob…...
中介者模式mediator
学习笔记,原文链接 https://refactoringguru.cn/design-patterns/mediator 减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。...
GO语言性能分析
Go语言基准测试与pprof工具性能分析详解 在现代软件开发中,性能优化是一个重要的环节。Go语言提供了强大的工具来进行基准测试和性能分析,其中 testing 包用于基准测试,而 pprof 工具用于性能分析。本文将详细讲解如何使用这些工具来进行性能…...
关于 PreparedStatement
Mysql 层面的语法也支持 prepare 这个确实第一次见 PREPARE prepares a statement for execution (see Section 13.5.1, “PREPARE Statement”).EXECUTE executes a prepared statement (see Section 13.5.2, “EXECUTE Statement”).DEALLOCATE PREPARE releases a prepared…...
漫谈设计模式 [9]:外观模式
引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你…...
多进程编程
基本概念 进程是一个具有单独功能的程序对某个数据集在处理机上的执行过程,进程也是作为资源分配的一个单位。 进程和程序是相辅相成的,进程是一个动态概念。 进程具有并行性特征。进程具有独立性和异步性。 进程的描述 进程分为三部分:…...
7-Zip压缩包如何添加密码,加密后如何取消
压缩包文件大家经常使用,最熟悉的肯定是RAR、ZIP格式压缩文件,但是7z压缩文件格式也很好用,它是三种压缩文件格式中压缩率最大的。想要将文件压缩到最小,使用7z格式可以达到最大化。那么在使用7z压缩格式的时候,我们可…...
HarmonyOS---应用测试概述
一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 (1)功能数据完备 (2)基础体验要求 (3)增…...
密码学---真题演练
✨Base加密:题目-base? 靶场网址:https://polarctf.com/ Base100加密!!! 得到的新的一串密码是 rot47 密码,属于凯撒密码的一种变体. ✨斐波那契:题目-FB 从第三项开始,每一项都等…...
时间日期工具类
时间日期工具类 import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;public class DateTimeUtils {private static final String DEFAULT_DATE_FORMAT "yyyy-MM-dd";private static final String DEFAULT_TIME_…...
linux中vim常用命令大全
前言 Linux有大量的配置文件,所以 Linux的文本处理工具也是比较多的,其中编辑一些配置文件时,常用的工具就是 vim。在Linux中,Vim编辑器是一个非常强大的文本编辑工具,它提供了多种模式和命令来满足不同的编辑需求。以…...
计算机的错误计算(八十九)
摘要 探讨反双曲余切函数 acoth(x) 在 附近的计算精度问题。 Acoth(x) 函数的定义为: 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002) . 不妨在 Excel 的单元格中计算,则有: 若在Python中用定义直接计算,则有几乎…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
