建议60:性能考虑,数组是首选

本文通过具体代码示例,对比了Java中数组和列表在执行相同操作时的性能差异。通过对数组和ArrayList进行求和操作并测量执行时间,展示了不同数据结构在大规模数据处理上的效率区别。
package com.company.section1;


import java.util.ArrayList;
import java.util.List;




public class Client {
//测试性能执行的循环次数
private static final int LOOP_NUM = 100000;
public static void main(String[] args) {
int[] score = new int[100];
//初始化数组和列表
List<Integer> list = new ArrayList<Integer>(100);
for(int i=0;i<score.length;i++){
score[i] = i;
list.add(i);
}
//测试数组性能
long begin = System.currentTimeMillis();
for(int i=0;i<LOOP_NUM;i++){
sum(score);
}
long end = System.currentTimeMillis();
System.out.println("数组(Array)执行时间:" +(end - begin) + " ms");

//测试列表执行时间
for(int i=0;i<LOOP_NUM;i++){
sum(list);
}
System.out.println("列表(List)执行时间:"  +(System.currentTimeMillis() - end)+ " ms");


}
//对数组求和
public static int sum(int[] datas){
int sum =0;
for(int i=0;i<datas.length;i++){
sum +=datas[i];
}
return sum;
}

//对列表求和计算
public static int sum(List<Integer> datas){
int sum =0;
for(int i=0;i<datas.size();i++){
sum +=datas.get(i);
}
return sum;
}
}
内容概要:本文详细介绍了一个基于Java和Vue的联邦学习隐私保护推荐系统的设计与实现。系统采用联邦学习架构,使用户数据在本地完成模型训练,仅上传加密后的模型参数或梯度,通过中心服务器进行联邦平均聚合,从而实现数据隐私保护与协同建模的双重目标。项目涵盖完整的系统架构设计,包括本地模型训练、中心参数聚合、安全通信、前后端解耦、推荐算法插件化等模块,并结合差分隐私与同态加密等技术强化安全性。同时,系统通过Vue前端实现用户行为采集与个性化推荐展示,Java后端支撑高并发服务与日志处理,形成“本地训练—参数上传—全局聚合—模型下发—个性化微调”的完整闭环。文中还提供了关键模块的代码示例,如特征提取、模型聚合、加密上传等,增强了项目的可实施性与工程参考价值。 适合人群:具备一定Java和Vue开发基础,熟悉Spring Boot、RESTful API、分布式系统或机器学习相关技术,从事推荐系统、隐私计算或全栈开发方向的研发人员。 使用场景及目标:①学习联邦学习在推荐系统中的工程落地方法;②掌握隐私保护机制(如加密传输、差分隐私)与模型聚合技术的集成;③构建高安全、可扩展的分布式推荐系统原型;④实现前后端协同的个性化推荐闭环系统。 阅读建议建议结合代码示例深入理解联邦学习流程,重点关注本地训练与全局聚合的协同逻辑,同时可基于项目架构进行算法替换与功能扩展,适用于科研验证与工业级系统原型开发。
源码来自:https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
<think>嗯,用户这次的问题是关于缓冲区是否必须使用数组实现,结合之前的讨论背景(ADC采样时间分析),用户可能正在开发嵌入式系统(比如STM32),需要处理数据缓冲问题。 用户引用了四段内容,但核心问题其实很明确:缓冲区是否只能用数组?从引用[3]和[4]看,用户显然接触过用数组实现的环形缓冲区(引用[4]的代码),但引用[3]提到“数组存储在一系列逻辑上连续的内存块中”,这暗示用户可能对内存布局有基础认知。 考虑到用户之前问过ADC采样时间,这次转向缓冲区实现,推测ta可能在设计数据采集系统。需要强调两点核心:1) 缓冲区的本质是连续内存块 2) 数组只是最直接的实现方式之一。 用户可能隐含的担忧是:如果不用数组,会不会增加复杂度?需要举例说明替代方案(如动态内存)的适用场景,同时提醒嵌入式场景的注意事项(内存碎片等)。引用[4]的环形缓冲区代码是个很好的切入点,可以借此展开讨论不同实现方案的权衡。 另外注意到用户引用了C++输入缓冲的内容(引用[1]),但当前问题更偏向C语言层面,需要明确区分语言特性——C++的流和C的数组缓冲区属于不同抽象层级。 最后要避免过度设计:对于大多数嵌入式场景,静态数组仍是最佳选择,其他方案仅作为知识扩展提及即可。</think>缓冲区在程序中**并非必须使用数组实现**,但数组是最常见且高效的实现方式之一。以下是关键分析: --- ### 📦 缓冲区的本质与实现方式 1. **核心需求**: 缓冲区需要**连续的内存空间**存储数据,并支持**高效读写**。数组天然满足内存连续性要求,因此成为首选方案[^3]。 2. **非数组实现方案**: - **动态内存分配** 通过`malloc`/`new`申请堆内存,用指针管理缓冲区(本质仍是连续内存块): ```c uint8_t *buf = malloc(BUF_SIZE); // 动态分配的缓冲区 ``` - **链表结构** 适用于非连续存储场景(牺牲访问效率换取动态扩展性): ```c struct BufferNode { uint8_t data; struct BufferNode *next; }; // 链表节点 ``` - **内存映射文件** 系统级缓冲区可能直接映射文件到内存(如Linux的`mmap`)。 --- ### ⚖️ 数组 vs 其他实现的对比 | **特性** | 数组实现 | 动态内存 | 链表实现 | |------------------|--------------------------|-----------------------|-----------------------| | **内存连续性** | ✅ 连续 | ✅ 连续 | ❌ 非连续 | | **随机访问速度** | ⚡ O(1) | ⚡ O(1) | 🐢 O(n) | | **内存开销** | 固定大小 | 动态调整 | 每个节点额外指针开销 | | **适用场景** | 高频读写、环形缓冲区[^4] | 大小不确定的数据流 | 频繁插入/删除操作 | --- ### 🔧 嵌入式场景的典型选择(以环形缓冲区为例) 引用[4]的环形缓冲区实现**依赖数组**,因其需满足: 1. **内存确定性**:避免动态分配导致内存碎片(RTOS敏感问题) 2. **高效访问**:ADC采样数据需被快速存储/读取[^1] 3. **边界控制**:通过下标取模实现环形回绕(`r`和`w`指针)[^4] ```c // 环形缓冲区结构体(依赖数组) typedef struct { uint8_t *buf; // 指向数组的指针 uint32_t r; // 读指针 uint32_t w; // 写指针 uint32_t len; // 数组长度 } circle_buf; ``` --- ### 💡 实践建议 1. **优先选择数组的场景**: - 数据规模固定(如协议帧、ADC采样队列) - 要求极高访问速度(DMA传输、中断服务程序)[^4] - 资源受限的嵌入式系统(避免动态分配开销) 2. **考虑其他方案的场景**: - 数据规模动态变化(如网络数据包)→ 动态内存 - 需频繁插入/删除(如事件队列)→ 链表 > 📌 **关键结论**:数组是缓冲区实现的最佳实践,但非唯一选择。设计时应根据**访问模式、性能要求和系统约束**综合决策[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值