如何在Futter开发中做性能优化?
目录
1. 避免不必要的Widget重建
问题:频繁调用setState()导致整个Widget树重建。
优化策略:
2. 高效处理长列表
问题:ListView一次性加载所有子项导致内存暴涨。
优化策略:
3. 图片加载优化
问题:加载高分辨率图片导致内存溢出。
优化策略:
4. 动画性能优化
问题:复杂动画导致UI卡顿。
优化策略:
5. 状态管理优化
问题:全局状态变化导致无关Widget重建。
优化策略:
6. 避免阻塞UI线程
问题:主线程执行耗时操作导致界面卡顿。
优化策略:
7. 使用性能分析工具
工具:Flutter DevTools
总结:性能优化检查表
案例分析
在Flutter开发中,性能优化是提升应用流畅度和用户体验的关键。但是对于没怎么接触过这方面的同学来说,可能对性能优化的理解还比较基础,这就需要从多个方面入手。首先,我们需要回顾一下之前学过的关于Flutter性能优化的知识点,比如三棵树、Widget生命周期、状态管理等,然后结合实际的开发场景,找到常见的性能问题及其解决方法。
以下从多个方面详细解释性能优化策略,并配合具体示例说明:
1. 避免不必要的Widget重建
首先,我记得在Flutter中,Widget的重建是非常频繁的,尤其是在使用setState时。如果每次重建都创建大量的新对象,可能会导致垃圾回收频繁,从而影响性能。因此,避免在build方法中创建不必要的对象是一个重要的优化点。比如使用const构造函数,或者将一些对象缓存起来重复使用。
问题:频繁调用setState()
导致整个Widget树重建。
优化策略:
-
使用
const
构造函数:减少相同Widget的重复创建。
// 优化前:每次重建都会创建新的Text
Text('Hello')// 优化后:使用const缓存实例
const Text('Hello')
-
拆分Widget:将静态部分提取为独立的
StatelessWidget
。
class StaticPart extends StatelessWidget {const StaticPart({super.key});@overrideWidget build(BuildContext context) {return const Text('Static Content');}
}
2. 高效处理长列表
接下来是关于列表的优化。当处理长列表时,比如ListView,如果不使用builder来构建,可能会导致所有的子Widget一次性加载到内存中,这显然对性能不利。而ListView.builder可以按需构建子项,只渲染当前可见的部分,这样可以减少内存的使用和渲染时间。另外,给列表项添加key也是一个优化点,尤其是当列表项有状态时,正确的key可以帮助Flutter更好地复用已有的Element,减少重建的开销。
问题:ListView
一次性加载所有子项导致内存暴涨。
优化策略:
-
使用
ListView.builder
:按需构建可见项。
ListView.builder(itemCount: 1000,itemBuilder: (context, index) => ListTile(title: Text('Item $index'),),
)
-
添加
itemExtent
:固定子项高度,提升滚动性能。
ListView.builder(itemExtent: 80, // 明确指定高度// ...
)
-
使用
keys
复用状态:确保动态列表项状态正确保留。
ListView.builder(itemBuilder: (context, index) => ListItem(key: ValueKey(items[index].id)),
)
3. 图片加载优化
然后是图片加载的优化。图片资源如果处理不当,比如加载高分辨率的图片而没有适当压缩,可能会导致内存占用过高,甚至引起应用卡顿或崩溃。使用缓存机制,比如cached_network_image包,可以缓存网络图片,减少重复下载的开销。另外,调整图片的尺寸和分辨率以适应实际显示需求,也能有效减少内存使用。
问题:加载高分辨率图片导致内存溢出。
优化策略:
-
使用
cached_network_image
:缓存网络图片,避免重复下载。
CachedNetworkImage(imageUrl: 'https://example.com/image.jpg',placeholder: (context, url) => CircularProgressIndicator(),errorWidget: (context, url, error) => Icon(Icons.error),
)
-
调整图片分辨率:使用
ResizeImage
缩小图片尺寸。
Image(image: ResizeImage(FileImage(File('path/to/image.jpg')),width: 200,height: 200,),
)
4. 动画性能优化
动画和复杂UI的优化也是关键。比如使用AnimatedBuilder而不是setState来驱动动画,可以避免不必要的Widget重建。另外,对于复杂的绘制操作,可以考虑使用CustomPaint和Canvas来直接绘制,而不是组合多个Widget,这样可以减少Widget树的结构复杂度,提升渲染性能。
问题:复杂动画导致UI卡顿。
优化策略:
-
使用
AnimatedBuilder
:分离动画逻辑与UI构建。
AnimationController _controller;@override
Widget build(BuildContext context) {return AnimatedBuilder(animation: _controller,builder: (context, child) => Transform.rotate(angle: _controller.value * 2 * pi,child: child,),child: const Icon(Icons.refresh),);
}
-
预加载动画资源:在
initState
中初始化动画控制器。
@override
void initState() {super.initState();_controller = AnimationController(vsync: this,duration: Duration(seconds: 1),)..repeat();
}
5. 状态管理优化
状态管理方面,选择合适的状态管理方案也能影响性能。例如,使用Provider或GetX等状态管理工具进行局部状态管理,可以避免全局状态变化引起的整个Widget树重建。合理分割状态的作用域,只在需要的地方监听状态变化,减少重建的范围。
问题:全局状态变化导致无关Widget重建。
优化策略:
-
使用
Provider
或 GetX等工具进行局部更新:仅通知依赖状态的组件。
// 使用Provider选择器减少重建
Consumer<AppState>(selector: (_, state) => state.counter,builder: (context, counter, _) => Text('$counter'),
)
-
避免在
build
中创建回调函数:缓存函数引用。
class _MyWidgetState extends State<MyWidget> {void _handleClick() => print('Clicked');@overrideWidget build(BuildContext context) {return ElevatedButton(onPressed: _handleClick, // 使用类方法而非匿名函数child: Text('Button'),);}
}
6. 避免阻塞UI线程
还有,避免在build方法中进行耗时操作,比如同步的IO操作或复杂计算,这些操作会阻塞UI线程,导致界面卡顿。应该将这些操作移到异步任务中执行,或者使用Isolate来并行处理。
问题:主线程执行耗时操作导致界面卡顿。
优化策略:
-
使用
compute
或Isolate
:将计算密集型任务移至后台。
void _heavyCalculation() {compute(backgroundTask, data).then((result) {setState(() => _result = result);});
}static int backgroundTask(int data) {// 耗时计算return data * 2;
}
7. 使用性能分析工具
另外,使用Flutter的性能分析工具,如DevTools,可以帮助定位性能瓶颈。通过查看帧率、GPU和CPU的使用情况,可以找出哪些部分的代码执行时间过长,从而有针对性地进行优化。
工具:Flutter DevTools
-
功能:
-
CPU Profiler:定位耗时函数。
-
Memory:检测内存泄漏。
-
Frame Chart:分析渲染帧率。
-
-
使用步骤:
-
运行应用时执行
flutter run --profile
。 -
打开DevTools(
flutter pub global run devtools
)。 -
连接设备并分析性能数据。
-
总结:性能优化检查表
优化方向 | 具体措施 | 示例场景 |
---|---|---|
Widget构建 | 使用const 、拆分Widget、避免冗余重建 | 静态内容、频繁更新的组件 |
列表处理 | ListView.builder 、itemExtent 、keys | 长列表、动态数据 |
图片加载 | 缓存、调整尺寸、懒加载 | 网络图片、图库应用 |
动画优化 | AnimatedBuilder 、预加载控制器 | 复杂转场、粒子效果 |
状态管理 | 局部状态、选择器监听 | 表单输入、用户偏好设置 |
异步任务 | compute 、Isolate | 数据解析、文件操作 |
通过结合具体场景应用上述策略,可显著提升Flutter应用的性能表现!!
案例分析
在实际开发中,可能会遇到一些具体的问题,比如页面跳转时的卡顿,或者某个复杂动画不流畅。这时候需要具体问题具体分析,结合上述的优化策略,逐步排查和调整。
例如,假设有一个页面,里面有一个垂直滚动的ListView,每个列表项都包含一张图片和一些文本。当快速滚动时,发现有明显的卡顿现象。这时候,我们可能需要检查以下几点:
- 是否使用了ListView.builder而不是ListView,确保列表项是按需构建的。
- 图片是否使用了缓存,比如cached_network_image,避免重复下载。
- 图片的尺寸是否合适,是否加载了过大的图片导致内存压力。
- 列表项的Widget结构是否过于复杂,是否有不必要的嵌套,可以尝试简化布局。
- 是否给列表项添加了唯一的key,帮助Flutter复用已有的Element。
通过逐一排查这些问题,并应用相应的优化措施,应该能够提升列表滚动的流畅度。
再比如,一个包含复杂动画的页面,动画过程中出现卡顿。
这时需要检查动画的实现方式,是否使用了高效的动画组件,如使用AnimatedContainer或显式动画控制器(AnimationController),并确保在动画过程中不会触发整个Widget树的重建。如果动画是通过不断调用setState来更新状态,可能需要改为使用AnimatedBuilder,将动画的逻辑与UI构建分离,减少重建的范围。
此外,对于频繁更新的状态,比如游戏中的实时数据,可以考虑使用更高效的状态管理方案,或者将部分计算移到Isolate中执行,避免阻塞UI线程。
总的来说,性能优化需要从多个方面综合考虑,包括Widget的构建、列表的处理、图片的加载、动画的实现、状态管理以及异步任务的处理等。通过合理的设计和优化,可以显著提升Flutter应用的流畅度和响应速度。
相关文章:
如何在Futter开发中做性能优化?
目录 1. 避免不必要的Widget重建 问题:频繁调用setState()导致整个Widget树重建。 优化策略: 2. 高效处理长列表 问题:ListView一次性加载所有子项导致内存暴涨。 优化策略: 3. 图片加载优化 问题:加载高分辨率…...
leetcode 75.颜色分类(荷兰国旗问题)
题目描述 题目分析 本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的,统计0、1、2的数量然后按顺序赋值,或者手写一个冒泡排序,whatever。 但是在这一题中我们主…...
JVM--垃圾回收
垃圾回收的概念 垃圾回收主要针对的是堆中的对象,堆是一个共享的区域,创建的对象和数组都放在这个位置。但是我们不能一直的创建对象,也不是所有的对象能一直存放,如果不进行垃圾回收,内存迟早会耗尽,及时…...
Spring boot3-Http Interface: 声明式编程
来吧 1.首先引入pom.xml依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 2.创建WebClientController控制器 import com.atguigu.boot3_07_http.serv…...
springboot EasyExcel 实现导入导出
1. 添加依赖 确保 Maven 依赖中包含 EasyExcel 3.0.5: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency><!-- excel工具 --><dep…...
基于RAGFlow本地部署DeepSpeek-R1大模型与知识库:从配置到应用的全流程解析
作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客 10分钟上手…...
spring 创建单例 Bean 源码分析
一、创建单例Bean 1、创建单例 Bean 通过方法getBean()来创建单例bean。 代码入口: org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons spring boot version:2.6.13 org.springframework.beans.factory…...
GetCurrentTime
在实际编程中难免要获取当前时间并且进行格式化,本文给出了多种 GetCurrentTime() 方法以供选择。 C语言下使用strftime C 语言中可以使用 <time.h> 中的函数来获取和格式化时间 #include <stdio.h> #include <time.h>char* getCurrentTime() …...
HTB 学习笔记 【中/英】《Web 应用简介》P1
📌 这篇文章讲了什么? 介绍了 Web 应用 的概念、架构,以及与传统网站的区别。重点讲解了 Web 安全风险,包括 常见攻击方法(SQL 注入、文件包含、不安全的文件上传等)。介绍了 Web 渗透测试 的重要性&#…...
ROS catkin_make编译报错问题
对问题 CMake Error at graduation_design/CMakeLists.txt:226 (add_dependencies): The dependency target "graduation_design_generate_messages_cpp" of target "listener" does not exist 检查 generate_messages() 是否被注释 对 CMake Error at …...
【结构设计】3D打印创想三维Ender 3 v2
【结构设计】3D打印创想三维Ender 3 v2 文章目录 前言一、Creality Slicer1.2.3打印参数设置二、配件更换1.捆扎绑扎线2.气动接头3D打印机配件插头3.3D打印机配件Ender3pro/V2喷头套件4.读卡器 TF卡5.micro sd卡 三、调平四、参考文章总结 前言 使用工具: 1.创想三…...
并发编程2
接并发编程1 synchronized锁的实现 通过底层指令控制实现,Java提供的一种原子性内置锁,在进入synchronized后会从主内存复制一份共享变量到自己的工作内存,在工作内存中修改完成后,退出时会把工作内存的值写入到主内存ÿ…...
Linux 中 Git 使用指南:从零开始掌握版本控制
目录 1. 什么是 Git? Git 的核心功能: 2. Git 的安装 Ubuntu/Debian 系统: 验证安装: 3.gitee库 4. Git 的首次配置 配置用户名和邮箱: 查看配置: 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...
C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)
BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个,每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍,留下Luck 以及 路由器相关的 端口记录信息。 (因为自…...
2024年12月CCF-GESP编程能力等级认证C++编程四级真题解析
四级真题的难度: 一、总体难度评价 CCF-GESP编程能力等级认证C++四级真题的难度通常被认为相对较高。它不仅要求考生具备扎实的C++编程基础,还需要考生掌握一定的算法和数据结构知识,以及良好的问题解决能力。 二、具体难度分析 理论知识考察: 单选题和判断题中,会涉…...
谷歌Chrome或微软Edge浏览器修改网页任意内容
在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...
《DeepSeek深度使用教程:开启智能交互新体验》Deepseek深度使用教程
《DeepSeek使用教程:开启智能交互新体验》 在当今数字化时代,人工智能技术正以前所未有的速度改变着我们的生活和工作方式。DeepSeek作为一款强大的人工智能工具,凭借其卓越的自然语言处理能力和多领域应用潜力,受到了众多开发者…...
Dijkstra算法
Dijkstra算法(迪杰斯特拉算法)是一种经典的单源最短路径算法,用于在加权图中找到从一个源点到所有其他顶点的最短路径。它要求图中不能有负权边,因为负权边可能会导致算法的贪心策略失效。 Dijkstra算法的基本思想 Dijkstra算法…...
Python中的静态方法如何使用?
在Python里,类当中的方法可以分为多种不同的类型,其中staticmethod是一个十分有趣而又实用的功能。我们来好好地聊一聊什么是静态方法,它的用途是什么,以及如何在实际应用中使用它们! 首先,定义一下静态方…...
【最后203篇系列】016 Q201架构思考
前言 Q200已经达到了我既定的目标,在最近的3个月,我需要进一步完善,达到可以试产的程度。 在这个过程当中,许多知识和体会一直在变。 qtv200到目前,虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…...
小脑萎缩会致命吗?
小脑萎缩,顾名思义,是指小脑的体积减小或结构发生异常,进而影响其正常功能。小脑作为人体重要的协调和运动控制中心,负责维持身体平衡、调节肌肉张力和协调运动等关键功能。当小脑出现萎缩时,患者可能会出现步态不稳、…...
pip install和conda install的区别
这里写目录标题 一、什么是 Python 依赖(Python Dependencies)?1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1:使用 venv(推荐)创建虚拟环境激…...
這是我第一次寫關於aapenal服務器管理控制面板的文章
首先我們來認識一下服務器管理面板的所有功能 網站管理功能: 支持創建和管理多個網站。配置虛擬主機(Vhost)和域名綁定。自動安裝常用應用(如WordPress、Joomla等)。 文件管理功能: 文件上傳、…...
requests库的request和response对象的属性和方法
Python requests库 request 参数信息 response 参数信息...
8664蛋糕的美味值
8664蛋糕的美味值 ⭐️难度:中等 🌟考点:枚举 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in );int n sc.nextInt();int k s…...
【MySQL】数据库简要介绍和简单应用
目录 数据库简要介绍 SQL 的简单应用 需要注意的: 数据库简要介绍 数据库(database)是指长期存储在计算机内,有组织的、可共享的数据集合。它可视为一个电子化的文件柜,用来存储电子文件,用户可以对文件中的数据进行査询、新增、更新、删…...
yolo环境 pytorch环境配置 CUDA安装
我的成功案例:首先安装python 3.12.9的conda虚拟环境 (如果不安装3.12的会报错误ModuleNotFoundError:没有名为“numpy._core”的模块) 然后安装11.8cuda (其实我是可以最高安装12.6的cuda但我实测,太高版…...
camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)
1 概述 camellia-redis-proxy是一款高性能的redis代理(https://github.com/netease-im/camellia),使用netty4开发,主要特性如下: 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…...
python相关语法的学习文档1
python相关语法的学习文档1 1、tqdm tqdm 是 Python 中一个非常流行的进度条库,可以实时显示循环或任务的进度。它简单易用,支持多种场景(如循环、文件处理、多线程/进程等)。以下是详细的使用讲解: 1.1 安装 pip install tqdm1.2 基本用法 from tqdm import tqdm impo…...
Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)
Axure是一款非常强大的原型设计工具,它允许设计师和开发者快速创建高保真原型,以展示应用或网站的设计和功能。通过引入各种元件库,如ElementUI元件库,可以极大地丰富Axure的原型设计能力,使其更加贴近实际开发中的UI组…...
Java 并发编程——BIO NIO AIO 概念
参考 Java 并发编程——BIO NIO AIO 概念 阻塞与非阻塞、同步与异步概念 系统调用、缓存、物理设备阻塞与非阻塞同步与异步 四种主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路复用异步 IO select,poll,epoll 系统调用命令...
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别
在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述: picker 是微信小程序中的原生组件,通常用于选择单项或多项值,如时…...
笔记本 Win10 部署阿里通义千问 1.5-0.5B 大模型 mini 版
文章目录 1.环境准备1.1 硬件环境1.2 OS 环境1.3 Python 环境 2.环境安装2.1 CUDA 驱动下载安装2.2 torch 库下载安装2.3 transformers 库安装2.3 accelerate 库安装2.4 验证 CUDA 是否可用2.5 下载 Qwen1.5-0.5B 大模型 3.测试大模型3.1 加载大模型3.2 简单对话3.3 亲测体验感…...
SpringBoot事件驱动
1、概述 Spring事件驱动采用了观察者设计模式,主要作用就是实现对象之间的松耦合通信。它的核心思想是通过事件的发布和监听来实现不同组件之间的交互。(跟mq挺像) 基础概念: 事件(Event): 在Spring中&am…...
nginx中间件部署
普通权限账户安装NGINX中间件 1、拥有高级权限的账户安装必要的插件 sudo yum install -y gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、普通账户进行NGINX的脚本式安装 vi nginx_intall.sh #!/bin/bash TAR_NAME"$1" TAR_NAME_DIRba…...
Qt程序基于共享内存读写CodeSys的变量
文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中,我们实现了通过字符串读写…...
vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。
vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。 一、信息收集 2025.3.14 PM 12:18 1、主机发现 arp-scan -l nmap -sn 192.168.66.0/24 2、端口扫描 1、nmap --min-rate 10000 -p- 192.168.66.182 -oA port 查看所有开放端口2、map -sS -sV 192.168.6…...
技术-NBIOT
是什么? 窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…...
【论文阅读】AlexNet——深度学习奠基作之一
原文链接 Step 1 1. titleabstract 第一句:告诉我干了什么事情 我们训练了一个很大很深的卷积神经网络,用来对120w个图片作分类,这里面有1000个类 第二句:结果 在测试集上面,top-1 error37.5%,top-517.0…...
【云原生技术】编排与容器的技术演进之路
一、编排与容器的技术演进之路 1.1 DockerClient 此时 K8s 只是编排领域的一个选择,而 Docker 此时一家独大,所以 K8s 的客户端只 是作为 Docker 的客户端来调用 Docker 引擎来完成服务。 1.2 RUNC&Shim OCI催生 runcrunc,剥离 Docke…...
鸿蒙编译框架插件HvigorPlugin接口的用法介绍
鸿蒙系统中HvigorPlugin接口实现自定义编译插件,实现编译前后自定义功能。 在鸿蒙(HarmonyOS)开发中,HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口,开发者可以自定义构建任务、修改构建流程或…...
Springboot+mybatis实现增删改查操作
继续写一下删除操作,删除有些不一样,首先在controller里面,我们需要改一下路由,我们后面要写/{id}传入路径参数,用PathVariable注解绑定id,剩下的都一样,传入id,然后写service和mapp…...
Java中的I/O
1.I/O流 1.1I/O概述 1.2.基本用法 1.3.字节输出流写数据的细节 1.4.FileOutPutStream写数据的三种方式 明天再更~~~~,先混个流量券。...
前端组件封装艺术:设计原则与最佳实践指南
文章目录 一、组件封装的核心原则1.1 设计原则概览1.2 组件生命周期 二、组件设计准则2.1 单一职责原则2.2 高内聚低耦合 三、组件接口设计3.1 Props设计规范3.2 代码示例 四、组件状态管理4.1 状态设计原则4.2 代码示例 五、组件样式处理5.1 样式方案对比5.2 代码示例 六、组件…...
SpringMVC(五)拦截器
目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置,并指定拦截路径。 3 运行结果展示: 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制,允许在请求被目标方法处理的…...
jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.
无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样,还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…...
【红黑树】—— 我与C++的不解之缘(二十五)
前言 学习了avl树,现在来学习红黑树。 一、什么是红黑树 红黑树是一颗平衡二叉搜索树,它每一个节点增加了一个存储位表示节点的颜色,可以是红色或者黑色。 相比较于AVL树,红黑树也是一个自平衡二叉搜索树,但是它与AVL树…...
机器学习 Day05 pandas库
1.pandas介绍和优点 Pandas 是 2008 年由 Wes McKinney 开发的开源 Python 库 。它专门用于数据挖掘和数据分析,具有以下特点: 数据结构独特:核心数据结构为 Series(一维)和 DataFrame(二维) …...
布达佩斯召开 | 2025年第五届能源与环境工程国际会议(CoEEE 2025)
会议简介 Brief Introduction 2025年第五届能源与环境工程国际会议(CoEEE 2025) 会议时间:2025年7月25日-27日 召开地点:匈牙利布达佩斯 大会官网:www.coeee.org CoEEE 2025将围绕“能源与环境工程”的最新研究领域而展开,为研究人…...
[C语言日寄] qsort函数的练习
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...