当前位置: 首页 > news >正文

群体智能避障革命:RVO算法在Unity中的深度实践与优化

引言:游戏群体移动的挑战与进化

在《全面战争》中万人战场恢弘列阵,在《刺客信条》闹市里人群自然涌动,这些令人惊叹的场景背后,都离不开一个关键技术——群体动态避障。传统路径规划算法(如A*)虽能解决单体寻路问题,但面对大规模移动单位时,常出现路径重叠、集体卡死等问题。**Reciprocal Velocity Obstacles(RVO)**算法的出现,通过模拟人类社交行为中的默契避让,实现了真正意义上的群体智能协作。本文将深入解析RVO的核心原理,并基于Unity引擎演示其从基础实现到高阶优化的完整技术方案。


一、RVO技术解析:算法内核与行为模拟

1.1 动态避障的数学本质

RVO的核心思想源于2008年Jur van den Berg等人提出的**速度障碍(Velocity Obstacle, VO)**理论。其数学模型可简化为:

VO定义:对于两个移动体A和B,若存在速度向量(v_A)和(v_B),使得在未来τ时间内发生碰撞,则这些速度组合构成VO区域。RVO通过对称性约束,要求双方共同承担责任,调整速度至VO补集区域。

VO_{A|B}^τ = { v | ∃t ∈ [0, τ] : p_A + tv ∈ B(t) }

其中,(B(t))表示B随时间膨胀的碰撞区域。

1.2 三阶段决策流程
  1. 感知阶段:每个Agent检测半径内其他实体的位置、速度。
  2. VO构建:基于相对速度计算碰撞锥形区域。
  3. 速度优化:在非碰撞区域内选择最接近期望速度的解。

[外链图片转存中…(img-WMjKyRJD-1743847215517)]

1.3 行为模拟的心理学映射

RVO的“相互责任”机制与人类社交规则惊人相似:

  • 社交距离:对应neighborDist参数,保持个体舒适空间。
  • 预测直觉:通过timeHorizon参数实现前瞻性决策。
  • 妥协策略:速度调整体现博弈论中的纳什均衡思想。

二、Unity中的RVO2-3D全链路实现

2.1 环境搭建:从源码到可运行Demo
  1. 源码编译(以Windows为例):

    git clone https://github.com/snape/RVO2-3D
    cmake -G "Visual Studio 16 2019" -A x64
    msbuild RVO2.sln /p:Configuration=Release
    

    将生成的RVO2.dll置于Assets/Plugins/x86_64

  2. C#封装层设计

    public class RVOSimulator
    {[DllImport("RVO2")]private static extern int CreateSimulator(float timeStep, float neighborDist, int maxNeighbors, float timeHorizon, float radius, float maxSpeed);[DllImport("RVO2")]private static extern void SetAgentPrefVelocity(int agentId, Vector3 velocity);private int simulatorId;public void Init() {simulatorId = CreateSimulator(0.25f, 2.0f, 10, 1.5f, 0.5f, 3.0f);}
    }
    
2.2 核心逻辑架构
Unity主循环
更新目标位置
计算期望速度
RVO求解器
获取新速度
更新Transform
动画状态同步
2.3 参数调优矩阵
参数组关键参数调试建议值关联影响
感知系统neighborDist2.0-5.0检测半径越大,计算量越高
响应特性timeHorizon0.5-2.0值小导致频繁转向,值大延迟响应
物理属性radius/maxSpeed0.3-1.0/1.0-5.0需匹配模型实际尺寸
性能相关maxNeighbors10-20超过20显著增加CPU负载

三、工业级优化方案:千人群体的流畅演绎

3.1 计算并行化:DOTS深度整合
[BurstCompile]
struct RVOSimulationJob : IJobParallelFor
{public NativeArray<AgentData> agents;[ReadOnly] public SpatialHashGrid spatialGrid;public void Execute(int index){var neighbors = spatialGrid.Query(agents[index].position, 5.0f);// 调用RVO核心算法agents[index].velocity = RVOCore.CalculateVelocity(agents[index], neighbors);}
}void Update()
{var job = new RVOSimulationJob { agents = agents.AsDeferredJobArray() };job.Schedule(agents.Length, 64).Complete();
}
3.2 多级LOD优化
// 根据距离相机的远近划分更新等级
foreach (var agent in agents)
{float distance = Vector3.Distance(cameraPos, agent.position);if (distance > 100f) agent.LOD = UpdateLOD.Skip;else if (distance > 50f)agent.LOD = UpdateLOD.Low;elseagent.LOD = UpdateLOD.Full;
}
3.3 混合导航策略
NavMesh
全局路径
生成路径点
是否靠近动态障碍
启用RVO局部避障
直接朝向下一个路径点

四、疑难场景突破:复杂地形与异常处理

4.1 斜坡与楼梯适配
void AdjustForSlope(Vector3 position)
{RaycastHit hit;if (Physics.Raycast(position + Vector3.up, Vector3.down, out hit, 2.0f)){float slopeFactor = 1.0f - Mathf.Clamp01(hit.normal.y);agent.maxSpeed *= Mathf.Lerp(1.0f, 0.7f, slopeFactor);}
}
4.2 群体死锁解决方案
  1. 层级避障策略
    if (StuckTime > 3.0f)
    {EnableHierarchicalRVO(priorityLevel++);TemporaryBypassCollision(true);
    }
    
  2. 动态半径调节
    agent.radius = Mathf.Lerp(originalRadius, originalRadius * 1.3f, congestionLevel);
    
4.3 跨平台性能适配
平台优化策略典型Agent数量
PC多线程+GPU加速5000+
主机SPU协处理器优化3000
移动端固定帧率更新+八叉树空间划分800

五、未来演进:当RVO遇见机器学习

  1. 参数自学习系统:通过强化学习动态调整timeHorizon等参数。
  2. 异构群体模拟:结合GAN生成多样化的避让风格。
  3. 大模型辅助决策:使用Transformer预测群体运动趋势。
# 伪代码:基于PPO的参数优化
class RVOPolicyNetwork(nn.Module):def forward(self, state):time_horizon = self.layer(state)return time_horizonenv = RVOEnvironment()
agent = PPOAgent()
for episode in range(1000):state = env.reset()while not done:action = agent.select_action(state)next_state, reward = env.step(action)agent.update(reward)

结语:开启智能群体新时代

RVO技术不仅革新了游戏角色的移动方式,更为无人机编队、自动驾驶等现实场景提供了关键技术启示。通过本文的深度剖析与Unity实践指南,开发者可快速构建千人级智能群体系统。随着计算技术的持续突破,未来的虚拟群体将展现出媲美真实世界的复杂行为,而RVO算法将继续在这一进程中扮演关键角色。

相关文章:

群体智能避障革命:RVO算法在Unity中的深度实践与优化

引言&#xff1a;游戏群体移动的挑战与进化 在《全面战争》中万人战场恢弘列阵&#xff0c;在《刺客信条》闹市里人群自然涌动&#xff0c;这些令人惊叹的场景背后&#xff0c;都离不开一个关键技术——群体动态避障。传统路径规划算法&#xff08;如A*&#xff09;虽能解决单…...

Java 实现选择排序:[通俗易懂的排序算法系列之一]

引言 大家好&#xff01;从今天开始&#xff0c;我计划写一个关于常见排序算法的系列文章&#xff0c;旨在用通俗易懂的方式&#xff0c;结合 Java 代码实现&#xff0c;帮助大家理解和掌握这些基础但非常重要的数据结构与算法知识。 排序是计算机科学中最基本的操作之一&…...

动画过渡设置

使用Animator的Trigger参数 步骤 1&#xff1a;打开 Animator 窗口 确保你的 Sprite 对象已添加 Animator 组件。 在 Unity 编辑器顶部菜单栏&#xff0c;选择 Window > Animation > Animator&#xff0c;打开 Animator 窗口。 步骤 2&#xff1a;创建 Trigger 参数 在…...

【项目管理-高项】学习方法 整体概览

相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 &#x1f4dd; 软考高项,全称 信息系统项目管理师 ,是软考高级资格项目之一。 本考试考三门科目&#xff1a;综合知识&#xff08;上午&#xff09;、案例分析&#xff08;下午…...

HarmonyOS应用开发者高级-编程题-001

题目一&#xff1a;跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用&#xff0c;要求&#xff1a; 手机与平板登录同一华为账号时&#xff0c;自动同步任务列表任一设备修改任务状态&#xff08;完成/删除&#xff09;&#xff0c;另一设备实时更新任务数据在设备…...

HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context

UIAbility及相关类关系 一个模块编译的时候会出一个HAP包&#xff0c; 每一个HAP包在运行时都对应一个AbilityStage。 AbilityStage持有一个AbilityStageContext一个APP&#xff0c; 有时候会有很多个HAP包&#xff0c; 至少一个。 一个APP运行时&#xff0c;对应的是我们的App…...

接口并行执行且流式顺序输出的解决方案

接口并行执行且流式顺序输出的解决方案: import asyncio from aiotas_agi2all_llms_utils.output_answer_from_ask_question_results import (reasoning_model_ask_question, ) import os from aiotas_agi2all_llms_utils.logging_utils import create_logger import uuid fr…...

浅谈AI - DeepSpeed - 单卡慎用!

前言 曾在游戏世界挥洒创意&#xff0c;也曾在前端和后端的浪潮间穿梭&#xff0c;如今&#xff0c;而立的我仰望AI的璀璨星空&#xff0c;心潮澎湃&#xff0c;步履不停&#xff01;愿你我皆乘风破浪&#xff0c;逐梦星辰&#xff01; 简介 Deepspeed 的 ZeRO&#xff08;Ze…...

Java Web从入门到精通:全面探索与实战(一)

目录 引言&#xff1a;开启 Java Web 之旅​ 一、Java Web 基础概念大揭秘​ 1.1 什么是 Java Web​ 1.2 Java Web 的优势剖析​ 1.3 Java Web 相关核心概念详解 二、搭建 Java Web 开发环境&#xff1a;步步为营 2.1 所需软件大盘点​ 2.2 软件安装与配置全流程​ 三…...

5G从专家到小白

文章目录 第五代移动通信技术&#xff08;5G&#xff09;简介应用场景 数据传输率带宽频段频段 VS 带宽中低频&#xff08;6 GHz以下&#xff09;&#xff1a;覆盖范围广、穿透力强高频&#xff08;24 GHz以上&#xff09;&#xff1a;满足在热点区域提升容量的需求毫米波热点区…...

leetcode111 二叉树的最小深度

相对于 104.二叉树的最大深度 &#xff0c;本题还也可以使用层序遍历的方式来解决&#xff0c;思路是一样的。 最小深度的定义&#xff1a;从根节点到最近叶子节点的最短路径上的节点数量。 特别注意&#xff1a; 如果一个子树不存在&#xff0c;就不能用它来计算深度&#x…...

算法设计学习10

实验目的及要求&#xff1a; 本查找实验旨在使学生深入了解不同查找算法的原理、性能特征和适用场景&#xff0c;培养其在实际问题中选择和应用查找算法的能力。通过实验&#xff0c;学生将具体实现多种查找算法&#xff0c;并通过性能测试验证其在不同数据集上的表现&#xff…...

数字统计题解

题目理解 题目要求计算所有不大于 N 的非负整数中数字 D 出现的总次数。例如&#xff0c;当 D1 且 N12 时&#xff0c;数字1出现在1、10、11&#xff08;两次&#xff09;、12中&#xff0c;共5次。 输入输出分析 输入格式&#xff1a; 两个正整数 D 和 N&#xff0c;其中1≤…...

eclipse导入工程提示Project has no explicit encoding set

eclipse导入工程提示Project has no explicit encoding set-CSDN博客...

【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析

【网络安全论文】筑牢局域网安全防线:策略、技术与实战分析 简述一、引言1.1 研究背景1.2 研究目的与意义1.3 国内外研究现状1.4 研究方法与创新点二、局域网网络安全基础理论2.1 局域网概述2.1.1 局域网的定义与特点2.1.2 局域网的常见拓扑结构2.2 网络安全基本概念2.2.1 网络…...

JVM虚拟机篇(五):深入理解Java类加载器与类加载机制

深入理解Java类加载器与类加载机制 深入理解Java类加载器与类加载机制一、引言二、类加载器2.1 类加载器的定义2.2 类加载器的分类2.2.1 启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;2.2.2 扩展类加载器&#xff08;Extension ClassLoader&#xff09;2.2.3 应用…...

纯个人整理,蓝桥杯使用的算法模板day4(图论 最小生成树问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个

目录 最小生成树Prim代码模拟流程图 kruskal代码 代码对应实现案例 最小生成树 最小生成树&#xff1a;在无向图中求一棵树&#xff08;n-1条边&#xff0c;无环&#xff0c;连通所有点&#xff09;&#xff0c;而且这棵树的边权和最小 &#xff08;ps&#xff1a;可能结果不止…...

学习笔记,DbContext context 对象是保存了所有用户对象吗

DbContext 并不会将所有用户对象保存在内存中&#xff1a; DbContext 是 Entity Framework Core (EF Core) 的数据库上下文&#xff0c;它是一个数据库访问的抽象层它实际上是与数据库的一个连接会话&#xff0c;而不是数据的内存缓存当您通过 _context.Users 查询数据时&…...

Kafka 和 Flink的讲解

一、Kafka&#xff1a;分布式消息队列 1. 核心概念 ​​角色​​&#xff1a;Kafka 是一个分布式、高吞吐量的​​消息队列​​&#xff08;Pub-Sub 模型&#xff09;&#xff0c;用于实时传输数据流。​​关键术语​​&#xff1a; ​​Producer​​&#xff08;生产者&…...

Kafka 高吞吐量的原因是什么?

Kafka 的高吞吐量是它成为“数据中枢”的关键特性之一&#xff0c;这背后是多个技术设计的巧妙配合。下面我给你整理一下 Kafka 高吞吐量的主要原因&#xff0c;通俗又系统。 ✅ 1. 顺序写磁盘&#xff08;磁盘也能飞&#xff09; Kafka 的消息写入是追加到日志末尾&#xff…...

基于Python+Flask的服装零售商城APP方案,用到了DeepSeek AI、个性化推荐和AR虚拟试衣功能

首先创建项目结构&#xff1a; fashion_store/ ├── backend/ │ ├── app/ │ │ ├── __init__.py │ │ ├── models/ │ │ ├── routes/ │ │ ├── services/ │ │ └── utils/ │ ├── config.py │ ├── requirements.t…...

26.[MRCTF2020]Transform 1

打开文件是可执行程序.exe&#xff0c;打开看一下&#xff0c;顺便拖入ExeinfoPE 查询一下基本信息。如图。 无壳&#xff0c;且是64-bit&#xff0c;打开执行文件也没有什么特别的信息。那就 IDA-x64 分析吧。 &#x1f197;&#xff0c;简单的一个加密&#xff0c;我们直接逆…...

LeetCode-98. 验证二叉搜索树

一、题目 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b; 若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的…...

【LeetCode Solutions】LeetCode 146 ~ 150 题解

CONTENTS LeetCode 146. LRU 缓存&#xff08;中等&#xff09;LeetCode 147. 对链表进行插入排序&#xff08;中等&#xff09;LeetCode 148. 排序链表&#xff08;中等&#xff09;LeetCode 149. 直线上最多的点数&#xff08;困难&#xff09;LeetCode 150. 逆波兰表达式求值…...

leetcode二叉树刷题调试不方便的解决办法

1. 二叉树不易构建 在leetcode中刷题时&#xff0c;如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤&#xff0c;那就是二叉树的题。 要调试二叉树有关的题需要根据测试用例给出的前序遍历&#xff0c;自己构建一个二叉树&#xff0c;…...

【家政平台开发(16)】消息通知系统设计:搭建高效沟通桥梁

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析&#xff0c;剖析家政行业现状、挖掘用户需求与梳理功能要点&#xff0c;到系统设计阶段的架构选型、数据库构建&#xff0c;再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…...

AI比人脑更强,因为被植入思维模型【44】成长破圈思维

giszz的理解&#xff1a;芒格说&#xff0c;不懂不投。我们一生都在追求破圈&#xff0c;突破本我&#xff0c;突破舒适圈、恐惧圈、学习圈、成长圈、自在圈&#xff0c;可是我们真正能懂的知识有实际真的太少了。这个思维模型给我的启迪&#xff0c;一是要破圈&#xff0c;二是…...

【JavaWeb-Spring boot】学习笔记

目录 <<回到导览Spring boot1. http协议1.1.请求协议1.2.响应协议 2.Tomcat2.1.请求2.1.1.apifox2.1.2.简单参数2.1.3.实体参数2.1.4.数组集合参数2.1.5.日期参数2.1.6.(重点)JSON参数2.1.7.路径参数 2.2.响应2.3.综合练习 3.三层架构3.1.三层拆分3.2.分层解耦3.3.补充 &…...

基于GitLab+Jenkins的持续集成实践指南

架构设计原则 分层自动化策略 基础层: 代码提交触发自动构建(100%自动化)中间层: 制品生成与验证(自动化+人工审核)发布层: 环境部署(受控手动触发)工具定位矩阵 工具核心职责关键优势GitLab源码管理+MR流程精细的权限控制Jenkins流水线编排+任务调度插件生态丰富Nexus制…...

用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏&#xff0c;曾经风靡一时。今天&#xff0c;我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目&#xff0c…...

医疗思维图与数智云融合:从私有云到思维图的AI架构迭代(代码版)

医疗思维图作为AI架构演进的重要方向,其发展路径从传统云计算向融合时空智能、大模型及生态开放的“思维图”架构迭代,体现了技术与场景深度融合的趋势。 以下是其架构迭代的核心路径与关键特征分析: 一、从“智慧云”到“思维图”的架构演进逻辑 以下是针对医疗信息化领域…...

Kafka 中,为什么同一个分区只能由消费者组中的一个消费者消费?

在 Kafka 中&#xff0c;同一个分区只能由消费者组中的一个消费者消费&#xff0c;这是 Kafka 的设计决策之一&#xff0c;目的是保证消息的顺序性和避免重复消费。这背后有几个关键的原因&#xff1a; 1. 保证消息顺序性 Kafka 中的每个 分区&#xff08;Partition&#xff…...

Kafka 中的批次

在 Kafka 中&#xff0c;批次&#xff08;Batch&#xff09; 是生产者发送消息的一个重要概念。它对 Kafka 的性能、吞吐量、延迟等有很大影响。批量处理可以使消息发送更高效&#xff0c;减少网络往返和磁盘写入的开销。 下面我将详细解释 Kafka 中的批次机制&#xff0c;包括…...

《UNIX网络编程卷1:套接字联网API》第7章:套接字选项深度解析

《UNIX网络编程卷1&#xff1a;套接字联网API》第7章&#xff1a;套接字选项深度解析 一、套接字选项核心原理 1.1 选项层级体系 套接字选项按协议层级划分&#xff08;图1&#xff09;&#xff1a; SOL_SOCKET&#xff1a;通用套接字层选项IPPROTO_IP&#xff1a;IPv4协议层…...

使用 pytest-xdist 进行高效并行自化测试

pytest-xdist 是 pytest 的一个扩展插件&#xff0c;主要用于实现测试用例的并行执行和分布式测试。通过利用多进程或者多机分布式的方式&#xff0c;pytest-xdist 能够显著缩短测试执行时间&#xff0c;提升持续集成&#xff08;CI&#xff09;流程的效率。 在自动化测试中&a…...

谈谈策略模式,策略模式的适用场景是什么?

一、什么是策略模式&#xff1f;​​ 策略模式&#xff08;Strategy Pattern&#xff09;属于​​行为型设计模式​​。核心思路是将一组​​可替换的算法​​封装在独立的类中&#xff0c;使它们可以在运行时动态切换&#xff0c;同时使客户端代码与具体算法解耦。它包含三个…...

网络安全防御核心原则与实践指南

一、四大核心防御原则 A. 纵深防御原则&#xff08;Defense in Depth&#xff09; 定义&#xff1a;通过在多个层次&#xff08;如网络、系统、应用、数据&#xff09;设置互补的安全措施&#xff0c;形成多层次防护体系。 目的&#xff1a;防止单一漏洞导致整体安全失效&…...

动态规划2——斐波那契数列模型——三步问题

1.题目 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有 n 阶台阶&#xff0c;小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模 1000000007。 示例 1&#xff1a; 输入&#xff1a;n 3 …...

周末总结(2024/04/05)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内&#xff0c;职场社交不要放在5min以外 职场的人际关系在面对利…...

常见的图像生成算法

综合技术原理、优化方向和应用场景&#xff0c;结合经典模型与前沿进展进行分述&#xff1a; 一、经典生成模型 1. 生成对抗网络&#xff08;GAN&#xff09; 原理&#xff1a;由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;通过…...

PE结构(十五)系统调用与函数地址动态寻找

双机调试 当需要分析一个程序时&#xff0c;这个程序一定是可以调试的&#xff0c;操作系统也不例外。在调试过程中下断点是很重要的 当我们对一个应用程序下断点时&#xff0c;应用程序是挂起的。但当我们对操作系统的内核程序下断点时&#xff0c;被挂起的不是内核程序而是…...

verilog状态机思想编程流水灯

目录 一、状态机1. 状态机基本概念2. 状态机类型3. Verilog 状态机设计要点 二、状态机实现一个1s流水灯三、DE2-115实物演示 一、状态机 1. 状态机基本概念 状态机&#xff08;Finite State Machine, FSM&#xff09;是数字电路设计中用于描述系统状态转换的核心组件&#x…...

Java实现N皇后问题的双路径探索:递归回溯与迭代回溯算法详解

N皇后问题要求在NN的棋盘上放置N个皇后&#xff0c;使得她们无法互相攻击。本文提供递归和循环迭代两种解法&#xff0c;并通过图示解释核心逻辑。 一、算法核心思想 使用回溯法逐行放置皇后&#xff0c;通过冲突检测保证每行、每列、对角线上只有一个皇后。发现无效路径时回退…...

#SVA语法滴水穿石# (000)断言基本概念和背景

一、前言 随着数字电路规模越来越大、设计越来越复杂,使得对设计的功能验证越来越重要。首先,我们要明白为什么要对设计进行验证?验证有什么作用?例如,在用FPGA进行设计时,我们并不能确保设计出来的东西没有功能上的漏洞,因此在设计后我们都会对其进行验证仿真。换句话说…...

【Android Studio 下载 Gradle 失败】

路虽远行则将至&#xff0c;事虽难做则必成 一、事故现场 下载Gradle下载不下来&#xff0c;没有Gradle就无法把项目编译为Android应用。 二、问题分析 观察发现下载时长三分钟&#xff0c;进度条半天没动&#xff0c;说明这个是国外的东西&#xff0c;被墙住了&#xff0c;需…...

贪心算法之Huffman编码

1. 算法推理 Huffman 编码的目标是为给定字符构造一种前缀码&#xff0c;使得整体编码长度最短。基本思想是&#xff1a; 贪心选择&#xff1a;每次选择频率最小的两个节点合并。合并后的节点的权值为两个子节点权值之和&#xff0c;代表这部分子树出现的总频率。 局部最优导…...

Flask学习笔记 - 表单

表单处理 基本表单处理&#xff1a;使用 request.form 获取表单数据。使用 Flask-WTF&#xff1a;结合 WTForms 进行表单处理和验证&#xff0c;简化表单操作。表单验证&#xff1a;使用验证器确保表单数据的有效性。文件上传&#xff1a;处理文件上传和保存文件。CSRF 保护&a…...

指针的补充(用于学习笔记的记录)

1.指针基础知识 1.1 指针变量的定义和使用 指针也是一种数据类型&#xff0c;指针变量也是一种变量 指针变量指向谁&#xff0c;就把谁的地址赋值给指针变量 #include<stdio.h>int main() {int a 0;char b 100;printf("%p,%p \n", &a,&b); // …...

【mongodb】mongodb的字段类型

目录 1. 基本数据类型1.1 String1.2 Number1.3 Boolean1.4 Date1.5 Null1.6 ObjectId1.7 Array1.8 Binary Data1.9 Object 2. 特殊数据类型2.1 Regular Expression2.2 JavaScript2.3 Symbol2.4 Decimal1282.5 Timestamp2.6 MinKey/MaxKey2.7 DBPointer 3. 常用字段类型示例4. 注…...

计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作

计算机视觉图像处理基础系列&#xff1a;滤波、边缘检测与形态学操作 一、前言二、滤波&#xff1a;图像的精细化处理​2.1 滤波基础概念​2.1.1 滤波的本质​2.1.2 图像噪声来源与类型​ 2.2 线性滤波​2.2.1 均值滤波​2.2.2 高斯滤波​ 2.3 非线性滤波​2.3.1 中值滤波​ 三…...