顺序表:从数组到高效数据管理的进化之路
一、线性表:数据结构的 “基础骨架”
在数据结构的世界里,线性表是最基础的结构之一。它是由n
个具有相同特性的数据元素组成的有限序列,就像一列整齐排列的士兵,每个元素都有唯一的前驱(除了第一个)和后继(除了最后一个)。
常见的线性表形式:顺序表、链表、栈、队列、字符串等。
逻辑与物理结构的区别:
- 逻辑上,线性表是连续的 “直线” 结构;
- 物理存储上,它可以是连续的(如数组)或非连续的(如链表)。
而本文的主角 ——顺序表,就是线性表在物理存储上采用数组实现的经典代表。
二、顺序表:数组的 “豪华升级版”
1. 什么是顺序表?
- 定义:顺序表是一种线性数据结构,其核心特点是物理存储连续。它通过一段地址连续的存储单元(通常为数组)依次存储数据元素,支持高效的随机访问和顺序操作。顺序表是线性表的一种实现方式,与链表不同,它在内存中以连续的块存储数据,类似于“紧密排列的火车车厢”
- 类比理解:
- 数组是 “毛坯房”,仅提供原始存储功能(固定大小,操作需手动管理);
- 顺序表是 “精装房”,在数组基础上增加了 “家具”(操作接口),让数据管理更便捷(提供自动化接口(如动态扩容),更适合实际应用场景)。
// 数组 vs 顺序表 int arr[10]; // 原始数组,仅能存储10个int // 顺序表结构体(动态版) typedef struct SeqList {int* a; // 动态数组,存储数据int size; // 有效数据个数int capacity; // 总容量 } SL;
2. 顺序表的分类:静态 vs 动态
(1)静态顺序表:定长数组的 “简单封装”
- 特点:容量在编译时固定,用宏定义或常量指定大小。
#define MAX_SIZE 100 typedef struct {int data[MAX_SIZE];int length; // 有效数据长度 } StaticSeqList;
- 优缺点:
优点:结构简单,访问元素高效(随机访问 O (1))。
缺点:容量固定,空间不足时无法扩展,空间浪费严重(给多了用不完,给少了不够用)。
(2)动态顺序表:按需扩容的 “灵活容器”
- 核心思想:用动态数组(指针 + 容量管理)实现,空间不足时自动扩容。
- 结构体设计:
typedef struct SeqList {int* a; // 指向堆区动态数组int size; // 当前有效数据个数(0 ≤ size ≤ capacity)int capacity; // 当前总容量 } SL;
- 核心优势:通过扩容机制(如每次扩容 2 倍),灵活应对数据量变化,避免静态表的 “空间灾难”。
三、动态顺序表的核心操作:从初始化到数据管理
1. 初始化与销毁:搭建 “数据容器”
- 初始化:分配初始空间,初始化容量和数据计数。
typedef CAPACITY 4 //定义初始容量 void SLInit(SL* ps) {ps->a = (int*)malloc(CAPACITY * sizeof(int));if (ps->a == NULL) {perror("malloc fail");return;}ps->size = 0;ps->capacity = CAPACITY; }
- 销毁:释放动态数组空间,避免内存泄漏。
void SLDestroy(SL* ps) {free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0; }
2. 扩容机制:应对 “空间不足” 的危机
- 触发条件:当
size == capacity
时,需要扩容。 - 实现逻辑:申请更大的空间(通常是原容量的 2 倍),拷贝数据,释放旧空间。
void SLCheckCapacity(SL* ps) {if (ps->size == ps->capacity) {int new_capacity = ps->capacity * 2;int* new_arr = (int*)realloc(ps->a, new_capacity * sizeof(int));if (new_arr == NULL) {perror("realloc failed");return;}ps->a = new_arr;ps->capacity = new_capacity;} }
- 注意:扩容会带来时间开销(数据拷贝),但摊还复杂度仍接近 O (1)。
3. 插入与删除:数据管理的 “核心操作”
(1)按位置插入:头部 / 尾部 / 中间
- 尾部插入(尾插):最简单高效的插入,时间复杂度 O (1)。
void SLPushBack(SL* ps, int x) {SLCheckCapacity(ps); // 先检查扩容ps->a[ps->size++] = x; // 直接放在末尾 }
- 头部插入(头插):需要将所有元素后移一位,时间复杂度 O (N)。
void SLPushFront(SL* ps, int x) {SLCheckCapacity(ps);// 从最后一个元素开始后移for (int i = ps->size; i > 0; i--) {ps->a[i] = ps->a[i-1];}ps->a[0] = x;ps->size++; }
- 指定位置插入:先检查位置合法性,再后移元素。
void SLInsert(SL* ps, int pos, int x) {if (pos < 0 || pos > ps->size) return; // 位置非法SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--) {ps->a[i] = ps->a[i-1];}ps->a[pos] = x;ps->size++; }
(2)按位置删除:尾部 / 头部 / 中间
- 尾部删除(尾删):直接减少
size
,无需移动元素,O (1)。void SLPopBack(SL* ps) {if (ps->size == 0) return; // 空表不能删ps->size--; }
- 头部删除(头删):将后续元素前移一位,O (N)。
void SLPopFront(SL* ps) {if (ps->size == 0) return;for (int i = 0; i < ps->size-1; i++) {ps->a[i] = ps->a[i+1];}ps->size--; }
- 指定位置删除:前移元素覆盖目标位置。
void SLErase(SL* ps, int pos) {if (pos < 0 || pos >= ps->size) return;for (int i = pos; i < ps->size-1; i++) {ps->a[i] = ps->a[i+1];}ps->size--; }
4. 查找与修改:快速定位数据
- 按值查找:遍历数组,返回第一个匹配元素的下标,O (N)。
int SLFind(SL* ps, int x) {for (int i = 0; i < ps->size; i++) {if (ps->a[i] == x) return i;}return -1; // 未找到 }
- 按位置访问:直接通过下标访问,O (1),顺序表的最大优势!
int GetElement(SL* ps, int pos) {if (pos < 0 || pos >= ps->size) return -1; // 非法位置return ps->a[pos]; }
四、顺序表的优缺点:适用场景大揭秘
1. 优点:高效访问,简单易用
- 随机访问 O (1):通过下标直接定位元素,比链表快得多(链表需遍历)。
- 存储密度高:元素连续存储,无需额外指针空间(对比链表每个节点需存储 next 指针)。
- 实现简单:基于数组,逻辑直观,适合入门学习和基础数据管理。
2. 缺点:插入删除低效,扩容有代价
- 中间 / 头部操作 O (N):插入删除需移动大量元素,数据量越大越耗时。
- 空间浪费:动态扩容会预留额外空间(如每次扩 2 倍),可能导致空闲空间浪费。
- 扩容开销:申请新空间、拷贝数据、释放旧空间,涉及 IO 操作,影响性能。
3. 适用场景
- 频繁访问元素:如数组、向量,适合 “查多改少” 的场景(如学生成绩表查询)。
- 数据规模可预估:若已知数据量不会剧烈变化,静态顺序表也能胜任。
- 需要高效存储:无需额外指针空间,适合对内存敏感的场景。
五、实战算法题:顺序表的典型应用
1. 移除元素
- 问题:给定数组
nums
和值val
,原地移除所有val
,返回新长度。 - 思路:双指针法,尾插非
val
元素,避免不必要的移动。 - 顺序表优势:利用连续存储特性,直接操作下标,高效实现。
2. 删除有序数组中的重复项
- 问题:移除有序数组中的重复元素,原地修改,返回新长度。
- 思路:双指针法,快指针遍历,慢指针记录唯一元素位置。
- 顺序表优势:有序性保证,移动元素次数少,时间复杂度 O (N)。
3. 合并两个有序数组
- 问题:将有序数组
nums2
合并到nums1
中,保持有序。 - 思路:从尾部开始倒序比较,避免头部插入的大量移动。
- 顺序表优势:利用数组可扩容特性(需提前分配足够空间),直接操作下标完成合并。
六、总结:顺序表,数据结构的 “实用派”
顺序表是数据结构中 “简单而强大” 的存在:
- 核心价值:基于数组的连续存储,实现高效的随机访问,是入门数据结构的必经之路。
- 适用场景:适合 “读多写少”、数据量可预估或需要高效存储的场景。
- 进阶思考:若需要频繁在中间位置插入删除,链表会更合适;若追求更高性能,可结合现代编程语言的动态数组(如 C++ 的
vector
、Python 的list
,本质都是顺序表封装)。
顺序表以其高效的随机访问和紧凑的内存布局,成为数据处理中的基础工具。尽管存在插入删除效率低、扩容成本高等问题,但其在特定场景(如静态数据、高频访问)中表现优异。理解顺序表的实现与局限,能帮助开发者更合理地选择数据结构,提升程序性能。
附页
//SeqList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;int capacity;
}SL;
void SLInit(SL* ps);
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
int SLFind(SL* ps, SLDataType x);
void SLInsert(SL* ps, SLDataType x,int pos);
void SLErase(SL* ps, int pos);
void SLDesTroy(SL* ps);
//SeqList.c
#include"SeqList.h"
void SLCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("realloc fail");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}
}
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}
void SLPopBack(SL* ps)
{assert(ps && ps->size);--ps->size;
}
void SLPopFront(SL* ps)
{assert(ps && ps->size);for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}
int SLFind(SL* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return 1;}}return 0;
}
void SLInsert(SL* ps, SLDataType x, int pos)
{assert(ps && (pos <= ps->size) && (pos >= 0));SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;
}
void SLErase(SL* ps, int pos)
{assert(ps && ps->size && (pos < ps->size) && (pos >= 0));for (int i = pos; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}--ps->size;
}
void SLDesTroy(SL* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}
相关文章:
顺序表:从数组到高效数据管理的进化之路
一、线性表:数据结构的 “基础骨架” 在数据结构的世界里,线性表是最基础的结构之一。它是由n个具有相同特性的数据元素组成的有限序列,就像一列整齐排列的士兵,每个元素都有唯一的前驱(除了第一个)和后继…...
TS知识补充第一篇 ✅
目录 1️⃣ any、unknow和never 2️⃣ 函数重载 3️⃣ typeof和keyof(配合构建字典类型的Demo,巨好用‼️) 4️⃣ TS的条件类型 5️⃣ TS的声明合并 一、any、unknow和never any any类型表示一个值可以是任何类型。通常在不确定变量的类型…...
每日一题(小白)模拟娱乐篇18
今天和大家一起玩个小游戏,给小朋友分糖果🍬 由题知就是小朋友每次给左手边的小朋友分一半糖果,一轮下来如果是奇数糖果老师就给他补一个直到所有小朋友拥有相同数量的糖果,问问老师发放了多少糖果。用程序进行模拟的大概思路就是…...
Linux系统学习Day2——在Linux系统中开发OpenCV
一、OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的跨平台计算机视觉和机器学习库,广泛应用于图像处理、视频分析、物体检测等领域。它提供了丰富的算法和高效的工具集,支持C、Python等多种语言,…...
Redisson 实现分布式锁
在平常的开发工作中,我们经常会用到锁,那么锁有什么用呢?锁主要是控制对共享资源的访问顺序,防止多个线程并发操作导致数据不一致的问题。经常可能会听到乐观锁、悲观锁、分布式锁、行锁、表锁等等,那么我们今天总结下…...
(适合中白)数据结构进阶篇——搜索专题(广度优先搜索算法BFS和深度优先搜索算法DFS)
深度优先搜索DFS&广度优先搜索BFS 深度优先搜索广度优先搜索 深度优先搜索 当碰到岔路口时,总是以深度作为前进的关键词,不碰到死胡同就不回头的这种搜索方式被称为深度优先搜索(Depth First Search) 深度优先搜索是一种枚举所有完整路径以遍历所有情…...
SGLang实战问题全解析:从分布式部署到性能调优的深度指南
引言:当高性能推理遇上复杂生产环境 在大型语言模型(LLM)的生产部署中,SGLang以其革命性的RadixAttention和结构化编程能力,正成为越来越多企业的首选推理引擎。然而,当我们将32B/70B级别的大模型部署到实际生产环境时࿰…...
Java大视界:解码航天遥测数据的银河密码——从GB到PB的技术革命
当长征火箭划破苍穹的瞬间,每秒产生的遥测数据足以填满一部4K电影。在这场与星辰对话的征程中,Java大数据生态正扮演着解码宇宙密码的"数字炼金师"。本文将带您穿越三个认知维度,揭示Java技术栈如何重构航天数据分析的底层逻辑。 …...
《C++探幽:STL(string类源码的简易实现(下))》
作者的个人gitee▶️ 作者的算法讲解主页 每日一言:“驿寄梅花,鱼传尺素,砌成此恨无重数。🌸🌸” 接《C探幽:STL(string类源码的简易实现(上))》🔴…...
求线性表的倒数第K项 (数组、头插法、尾插法)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)…...
rustdesk自建服务器怎么填写客户端配置信息
目录 # id、api、中继都怎么填?rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填? rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序(右下角托盘区有的话,需要右键点退出) 创建windows服务ÿ…...
4月8日日记
今天抖音刷到一个视频 记了一下笔记 想做自媒体,直播,抖音是最大的平台,但是我的号之前因为跟人互喷被封号了 今天想把实名认证转移到新号上,试了一下竟然这次成功了,本以为能开直播了但是 还是因为之前的号有违规记…...
VScode添加python解释器
先安装python扩展 然后点ctrlshiftp搜索python:select,选择解析器(或者也可以直接点左下方的)...
Elasticsearch | ES索引模板、索引和索引别名的创建与管理
关注:CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时,索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名,并提供具…...
用 Python 造轮子:打造轻量级 HTTP 调试工具
目录 一、为什么需要自建工具? 二、核心功能设计 三、技术选型 四、分步实现 第一步:搭建基础框架 第二步:实现请求转发逻辑 第三步:响应格式化处理 第四步:历史记录存储 五、进阶优化技巧 六、使用示例 七…...
java设计模式-原型模式
原型模式 1、原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象 2、原型模式是一种创见性设计模式,允许一个对象再创建另一个可定制的对象,无需知道如何创建的细节。 3、工作…...
【Java设计模式】第9章 原型模式讲解
9. 原型模式 9.1 原型模式讲解 定义:通过拷贝原型实例创建新对象,无需调用构造函数。特点: 创建型模式无需了解创建细节适用场景: 类初始化消耗资源多对象创建过程繁琐(如属性赋值复杂)循环体中需创建大量对象优点: 性能优于直接new简化创建流程缺点: 必须实现clone()…...
Python 快速搭建一个小型的小行星轨道预测模型 Demo
目录 ✅ Demo 目标: 🧪 模型方案选择 方案 1:开普勒 LSTM 混合预测(推荐 💡) 方案 2:全 AI:LSTM 直接拟合轨迹 🚧 环境准备 🔧 示例代码结构ÿ…...
【AI】Ragflow构建本地知识库
https://github.com/infiniflow/ragflow/blob/main/README_zh.md DeepSeek搭建的本地知识库很呆?不符合自己的预期?看完这个视频你就明白了!这样部署吊打其他的本地部署!跟着教程来,不怕学不会!_哔哩哔哩_…...
【Django】教程-12-柱状图
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...
市政消防栓智能监控管理系统(Axure高保真原型)
在城市的运转体系中,市政消防栓扮演着无可替代的关键角色,作为城市公共安全基础设施的核心,它是火灾扑救时的关键水源保障,其重要性不言而喻。当火灾这头 “猛兽” 突然来袭,市政消防栓就是那道阻止火势蔓延、守护生命…...
机器学习课堂6交叉熵代价函数的逻辑回归模型
代码 # 2-10交叉熵代价函数的逻辑回归模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 1000 # 迭代次数 learning_rate 0.1 # 学习率 m_train 250 # 训练样本数量# 读入酒驾检测数据集 df pd.read_csv(alcohol_d…...
华为ar1200修改con口密码
<Huawei> <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]user-interface console 0 进入端口 [Huawei-ui-console0]authentication-mode pass 以pass模式登录 [Huawei-ui-console0]set authentication password cipher …...
Java 集合有序性与重复性总结及记忆技巧
Java 集合有序性与重复性总结及记忆技巧 一、集合分类速查表 集合类型是否有序是否允许重复记忆口诀ArrayList✅ 有序(插入顺序)✅ 可重复"数组列表,顺序记牢"LinkedList✅ 有序(插入顺序)✅ 可重复"…...
机器学习--词向量转换
引言 在自然语言处理(NLP)的广阔领域中,计算机面临的一大挑战是理解人类语言的丰富性和复杂性。文本数据对于机器而言,最初只是一连串难以理解的字符。词向量转换便成为了一座关键的桥梁,它将文本中的单词映射为数值向…...
时序数据异常检测-综述
更新中 异常检测基本概念 广义的Out-of-Distribution(广义的OOD)来描述异常检测的相关问题。OOD包括五个相关的子领域,分别为Anomaly Detection(AD)、Novelty Detection(ND)、Open Set Recogntion(OSR)、Out-of-Distribution(OOD)和Outlier Detection(OD)。这5个…...
2025年Python的主要应用场景
李升伟 编译 Python在2025年仍是最受欢迎和强大的编程语言之一。其简洁易读的语法以及庞大的库生态系统,使其成为各行业开发者的首选。无论是构建复杂的数据管道,还是自动化重复性任务,Python都能提供广泛的应用场景,以实现快速、…...
树的深度遍历和广度遍历
目录 一、深度优先遍历(递归)二叉树的深度优先遍历(递归) 二、广度优先遍历二叉树的广度遍历 一、深度优先遍历(递归) #include<iostream> #include<vector>using namespace std;const int N1…...
C++函数如何返回多个参数
在编程中,我们经常会遇到需要函数返回多个值的场景。虽然 C 函数不能直接返回多个参数,但通过一些间接的方法,我们可以轻松实现这一需求。本文将详细介绍几种常见的实现方式,并分析它们的优缺点和适用场景。 1. 引言 在 C 中&…...
Python 实现的运筹优化系统代码详解(0-1规划指派问题)
一、引言 在数学建模的广阔领域中,指派问题作为一类经典且重要的组合优化问题,频繁出现在各类实际场景里。例如,在人力资源管理中,如何将不同技能水平的员工高效地分配到各个项目,以实现项目成本最小化或收益最大化&am…...
深度集成学习不均衡样本图像分类
用五个不同的网络,然后对分类概率进行平均,得到分类结果。基本上分类精度可以提升10% 1.导入基本库 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…...
ubuntu 20.04 复现 LVI-SAM
1.环境配置 ubuntu20.04 ROS-Noetic GTSAM 4.0.2 Ceres 1.14.0 前面的我都安装过了,但Ceres 我安装的是 2.2.0,现在安装Ceres 1.14.0 sudo apt-get update sudo apt-get install cmake libgoogle-glog-dev libgflags-dev libatlas-base-dev libeigen3-dev lib…...
每日OJ题_剑指offer数组篇(剑指offer04+剑指offer11+剑指offer21)
目录 剑指 Offer 04二维数组中的查找 代码解析 剑指 Offer 11旋转数组的最小数字 代码解析1 代码解析2 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 代码解析1 代码解析2 剑指 Offer 04二维数组中的查找 LCR 121. 寻找目标值 - 二维数组 - 力扣(LeetCo…...
使用 `tcpdump` 抓取 LiDAR 网络数据包详解
在调试机器人系统或自动驾驶平台时,我们经常需要分析网络中的 LiDAR(激光雷达)数据流。本文将介绍如何使用 tcpdump 工具对指定 IP 的数据包进行抓取和分析,特别是 LiDAR 数据的典型 UDP 报文。 一、什么是 tcpdump? …...
【NLP 55、强化学习与NLP】
万事开头难,苦尽便是甜 —— 25.4.8 一、什么是强化学习 强化学习和有监督学习是机器学习中的两种不同的学习范式 强化学习:目标是让智能体通过与环境的交互,学习到一个最优策略以最大化长期累积奖励。 不告诉具体路线,首先去做…...
【Linux】单例模式及其在线程池中的应用
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
Ansible的使用2
#### 一、Ansible变量 ##### facts变量 > facts组件是Ansible用于采集被控节点机器的设备信息,比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等 - setup模块 - 用于获取所有facts信息 shell ## 常用参数 filter…...
十三届蓝桥杯省赛A组 扫描游戏
#算法/线段树 #算法/快读 参考题解: 题解参考 这题思路: 先将坐标进行极角排序,按照顺时针的先后顺序,如果出现两个坐标在一个象限中,我们就先判断这两个坐标是否在同一条直线上,如果在同一条直线上,我们按照离原点最近的长度进行排序 之后,我们通过线段树的方法,定义结点tr[i]…...
Python 序列构成的数组(list.sort方法和内置函数sorted)
list.sort方法和内置函数sorted list.sort 方法会就地排序列表,也就是说不会把原列表复制一份。这 也是这个方法的返回值是 None 的原因,提醒你本方法不会新建一个列 表。在这种情况下返回 None 其实是 Python 的一个惯例:如果一个函数 或者…...
C++类与对象进阶知识深度解析
目录 一、再谈构造函数 (一)构造函数体赋值 (二)初始化列表 (三)成员变量初始化顺序 (四)explicit关键字 二、static成员 (一)概念 (二&am…...
【机器学习案列】基于LightGBM算法的互联网防火墙异常行为检测:数据不平衡的解决方案
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
详解minio部署
MinIO 是一款高性能、开源的分布式对象存储解决方案,专为存储非结构化数据(如图片、视频、备份数据等)而设计。MinIO 在吞吐量和延迟上表现出高性能提供与 Amazon S3 完全兼容的 API,支持水平扩展,支持端到端加密、访问…...
校园AI体育:科技赋能教育,运动点亮未来
校园AI体育:科技赋能教育,运动点亮未来 在数字化浪潮的推动下,人工智能(AI)已经悄然走进校园,成为教育领域的一股创新力量。而在体育教育中,AI技术的引入更是为传统体育教学注入了新的活力。校…...
LeetCode算法题(Go语言实现)_35
题目 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 一、代码实现 func goodNodes(root *TreeNode) int {if root nil {return 0}return d…...
ROS2_control 对机器人控制(不完整,有时间再更新)
ROS2_control 对机器人控制 安装与介绍安装介绍 使用gz 中写法.yaml文件中写法type: joint_state_broadcaster/JointStateBroadcaster的来源 命令接口关节控制command_interfacetransmission CMakelist.txt与package.xml文件 gz_ros2_control与自定义插件例子描述自定义插件使用…...
SAP-ABAP:SAP Enterprise Services Repository(ESR)技术全景解析
以下是对SAP PO中Enterprise Services Repository(ESR)的深度技术解析,包含详细架构设计、开发实践及企业级应用方案: SAP Enterprise Services Repository(ESR)技术全景解析 一、ESR核心架构与组件关系 1. 技术堆栈定位 ┌─────────────────────…...
每日一道leetcode
2130. 链表最大孪生和 - 力扣(LeetCode) 题目 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 < i < (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。 比方说&…...
通过Aop实现限制修改删除指定账号的数据
1、需求 对于Teach账号创建的数据,其他用户仅仅只有查询的权限,而不能修改和删除。并且部分接口只允许Teach账号访问 2、实现思路 在删除和修改时往往需要传递数据的id,进而可以通过id查询该数据是否由Teach账号创建。当然我们可以在每个删…...
递归实现指数型枚举
我们以n2 为例 我们每次都有选和不选两种 方案,对于每个数字 核心代码 tatic void dfs(int u) { // u代表当前处理的数字if (u > n) { // 终止条件:处理完所有数字for (int i 1; i < n; i) { // 遍历所有数字if (nums[i]) {…...
无代码国产流程引擎 FlowLong 1.1.6 发布
无代码国产流程引擎 FlowLong 1.1.6 于 2025 年 4 月 7 日发布。 FlowLong 是一款纯血国产自研的工作流引擎,具有以下特点: 核心精简:引擎核心仅 8 张表实现逻辑数据存储,采用 json 数据格式存储模型,结构简洁直观。组…...