数据结构——数组
数组定义:
在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。
因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。

性能空间占用
java中所有对象的大小都是8字节的整数倍,不足的要用对齐字节补足
随机访问
即根据索引查找元素,时间复杂度是O(1)
动态数组
private int size; // 逻辑大小private int capacity=8; // 容量private int[] array=new int[capacity];
插入
//向最后的位置[size]添加元素public void addLast(int element){array[size]=element;size++;}
//向[0....size]位置添加元素public void add(int index,int element){//未考虑数组扩容问题if(size>=0&&index<size) {//进行一个拷贝System.arraycopy(array, index, array, index + 1, size - index);array[index] = element;size++;} else if(index==size){//addLastarray[index]=element;size++;}}
public void add1(int index,int element){if(size >= 0 && index < size){System.arraycopy(array,index,array,index+1,size-index);}array[index]=element;size++;}
查询和遍历元素
//查询元素public int get(int index){//[0....size]return array[index];}//打印每个元素public void foreach(){for (int i=0;i<size;i++){System.out.println(array[i]);}}//函数式接口//遍历方法1,consumer接口 遍历执行的操作,每个元素入参public void foreach1(Consumer<Integer> consumer){for(int i=0;i<size;i++){consumer.accept(array[i]);}}//Iterator 是个接口,要有实现类//迭代器遍历@Overridepublic Iterator<Integer> iterator() {//java里叫匿名内部类return new Iterator<Integer>() {int i=0;@Overridepublic boolean hasNext() {//有没有下一个严肃return i<size;}@Overridepublic Integer next() {//返回当前元素,并移动到下一个元素return array[i++];}};}public IntStream stream(){//IntStream 传的数字不仅有有效数字,还有无效的 eg:1,2,3,4,0,0,0,0return IntStream.of(Arrays.copyOfRange(array,0,size));}
public static void main(String[] args) {System.out.println("Hello world!");DynamicArray dynamicArray = new DynamicArray();dynamicArray.addLast(1);dynamicArray.addLast(2);dynamicArray.addLast(3);dynamicArray.addLast(4);dynamicArray.add(2,5);for(int i=0;i<5;i++){System.out.println(dynamicArray.get(i));}//迭代器遍历for(Integer element:dynamicArray){//hasnext()、next()方法System.out.println(element);}}
删除
public int remove(int index){ //[0...size]int removed=array[index];if(index<size-1) {//java数组中移动元素的方法System.arraycopy(array, index + 1, array, index, size - index - 1);}size--;return removed;}
对比数据是否一致(断言)
assertEquals(3,removed);
assertIterable(List.of(1,2,4,5),dynamicArray);
容量不够,先扩容
private void checkAndGrow() {//容量检查if(size==0){array=new int[capacity];}if(size==capacity){//进行扩容,1.5 1.618 2capacity+=capacity>>1;int [] newArray=new int[capacity];System.arraycopy(array,0,newArray,0,size);array=newArray;}}
插入或删除性能
头部位置,时间复杂度是O(n)
中间位置,时间复杂度是O(n)
尾部位置,时间复杂度是O(1)
全部代码
package org.example;import java.util.Iterator;
import java.util.Arrays;
import java.util.function.Consumer;
import java.util.stream.IntStream;//动态数组
public class DynamicArray implements Iterable<Integer>{private int size; // 逻辑大小private int capacity=8; // 容量// private int[] array=new int[capacity];private int[] array={};//向最后的位置[size]添加元素public void addLast(int element){array[size]=element;size++;}//向[0....size]位置添加元素public void add(int index,int element){checkAndGrow();//未考虑数组扩容问题if(size>=0&&index<size) {//进行一个拷贝System.arraycopy(array, index, array, index + 1, size - index);array[index] = element;size++;} else if(index==size){//addLastarray[index]=element;size++;}}private void checkAndGrow() {//容量检查if(size==0){array=new int[capacity];}if(size==capacity){//进行扩容,1.5 1.618 2capacity+=capacity>>1;int [] newArray=new int[capacity];System.arraycopy(array,0,newArray,0,size);array=newArray;}}public void add1(int index,int element){if(size >= 0 && index < size){System.arraycopy(array,index,array,index+1,size-index);}array[index]=element;size++;}//查询元素public int get(int index){//[0....size]return array[index];}//打印每个元素public void foreach(){for (int i=0;i<size;i++){System.out.println(array[i]);}}//函数式接口//遍历方法1,consumer接口 遍历执行的操作,每个元素入参public void foreach1(Consumer<Integer> consumer){for(int i=0;i<size;i++){consumer.accept(array[i]);}}//Iterator 是个接口,要有实现类//迭代器遍历@Overridepublic Iterator<Integer> iterator() {//java里叫匿名内部类return new Iterator<Integer>() {int i=0;@Overridepublic boolean hasNext() {//有没有下一个严肃return i<size;}@Overridepublic Integer next() {//返回当前元素,并移动到下一个元素return array[i++];}};}public IntStream stream(){//IntStream 传的数字不仅有有效数字,还有无效的 eg:1,2,3,4,0,0,0,0return IntStream.of(Arrays.copyOfRange(array,0,size));}public int remove(int index){ //[0...size]int removed=array[index];if(index<size-1) {//java数组中移动元素的方法System.arraycopy(array, index + 1, array, index, size - index - 1);}size--;return removed;}}
二维数组
从行开始遍历比从列开始遍历更快。
局部性原理:(空间方面)
cpu读取内存(速度慢)数据后,会将其放入高速缓存(速度快)中当中,如果后来的计算机再用到此数据,在缓存中能读到的话,就不必读内存了。
缓存的最小存储单位是缓存行,一般是64bytes,一次读的数据少了不划算,因此最少读64bytes填满一个缓存行,因此读入某一个数据时也会读取其临近的数据,这就是所谓的空间局部性。
相关文章:
数据结构——数组
数组定义: 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。 性…...
python asyncio websockets server
python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…...
视频素材免费网站有哪些?8个视频素材库网站下载推荐
在视频创作领域,选择正确的高质量无水印素材网站能够极大地丰富您的作品,让每一帧都鲜活起来。下面,我们继续为您介绍更多优质的视频素材网站,每一个都是您创作旅程中的宝贵资源。 1. 蛙学府(中国) 集合了…...
ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异
引言 随着互联网的快速发展,信息的获取变得比以往任何时候都更加便捷。在数字化时代,人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息,然而,这种机械式的检索方式有时候并不…...
xargs后调用bash自定义函数(写该函数文本到脚本, 并引导PATH)
xargs后调用bash自定义函数 需要3步骤,如下 function to_markdown_href_func() { fp$1 #echo $fpecho -e "\n[${fp}](${PREFIX}/${fp})" }BIN/tmp/bin/ F$BIN/to_markdown_href_func.sh mkdir -p $BIN 获得函数to_markdown_href_func的文本 ,写文本到 /tmp/bin/to_ma…...
学术论文写作新利器:ChatGPT技巧详解
ChatGPT无限次数:点击直达 学术论文写作新利器:ChatGPT技巧详解 在如今信息爆炸的时代,学术论文写作变得愈发重要且具有挑战性。随着人工智能技术的不断发展,ChatGPT作为一种强大的写作辅助工具,为学术论文创作者提供了全新的可能…...
Spring整合JDBC
1、引入依赖 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><depen…...
详解Qt中的布局管理器
Qt中的布局管理是用于组织用户界面中控件(如按钮、文本框、标签等)位置和尺寸调整的一种机制。说白了就是创建了一种规则,随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器,每种都有其特定用途和特点。以下是对Qt…...
MyBatis 参数重复打印的bug
现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…...
ES6学习之路:迭代器Iterator和生成器Generator
迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…...
如何使用 DynamiCrafter Interp Loop 无缝连接两张照片
DynamiCrafter Interp Loop 是一个基于 AI 的工具,可以用来无缝连接两张照片。它使用深度学习技术来生成中间帧,从而使两张照片之间的过渡更加自然流畅。 使用步骤 访问 DynamiCrafter Interp Loop 网站:https://huggingface.co/spaces/Dou…...
今天起,Windows可以一键召唤GPT-4了
ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了? 把 Copilot 按钮放在 Window…...
使用Kaggle API快速下载Kaggle数据集
前言 在使用Kaggle网站下载数据集时,直接在网页上点击下载可能会很慢,甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包: pip install…...
java 通过 microsoft graph 调用outlook(二)
这次提供一些基础调用方式API PS: getMailFolders 接口返回的属性中,包含了未读邮件数量unreadItemCount 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava<…...
【机器学习】代价函数
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...
[leetcode] 100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&a…...
08、Lua 函数
Lua 函数 Lua 函数Lua函数主要有两种用途函数定义解析:optional_function_scopefunction_nameargument1, argument2, argument3..., argumentnfunction_bodyresult_params_comma_separated 范例 : 定义一个函数 max()Lua 中函数可以作为参数传递给函数多返回值Lua函…...
【数据分析面试】1. 计算年度收入百分比(SQL)
题目 你需要为公司的营收来源生成一份年度报告。计算截止目前为止,在表格中记录的第一年和最后一年所创造的总收入百分比。将百分比四舍五入到两位小数。 示例: 输入: annual_payments 表 列名类型amountINTEGERcreated_atDATETIMEstatusV…...
数据库SQL语句速查手册
SQL 语句语法AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR conditionALTER TABLEALTER TABLE table_name ADD column_name datatypeorALTER TABLE table_name DROP COLUMN column_nameAS (alias)SELECT column_name AS column_alias FROM table_name…...
智慧城市一屏统览,数字孪生综合治理
现代城市作为一个复杂系统,牵一发而动全身,城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维,从构成城市诸多要素、结构、功能等方面入手,系统推进…...
通义千问1.8B-GPTQ-Int4快速上手:3步完成vLLM部署与Web交互调用
通义千问1.8B-GPTQ-Int4快速上手:3步完成vLLM部署与Web交互调用 1. 环境准备与快速部署 想要快速体验通义千问1.8B模型的强大能力吗?只需要三个简单步骤,你就能在自己的环境中部署这个经过GPTQ-Int4量化优化的轻量级模型,并通过…...
【Dlib人脸识别】2. 基于欧氏距离的人脸匹配实战解析
1. 欧氏距离在人脸匹配中的核心作用 人脸识别技术的核心挑战在于如何量化两张人脸的相似度。Dlib采用128维特征向量来表示人脸特征,而欧氏距离就是衡量这些高维向量相似度的标尺。想象一下,我们把每个人脸特征看作星空中的一个星座,距离越近的…...
Kimi-VL-A3B-Thinking企业部署:多租户隔离+权限控制+使用统计看板
Kimi-VL-A3B-Thinking企业部署:多租户隔离权限控制使用统计看板 1. 企业级部署方案概述 Kimi-VL-A3B-Thinking作为一款高效的多模态视觉语言模型,在企业环境中部署需要解决三个核心问题:多租户隔离、权限精细控制和使用情况可视化监控。本方…...
构建企业级知识库语义搜索引擎:NLP-StructBERT与MySQL协同实战
构建企业级知识库语义搜索引擎:NLP-StructBERT与MySQL协同实战 你是不是也遇到过这样的烦恼?公司内部堆积如山的文档、报告、产品手册,当你想找一份关于“如何解决客户退款流程中的常见问题”的资料时,在搜索框里输入“退款 流程…...
SEO_快速掌握关键词研究的正确方法与工具使用
为什么关键词研究如此重要? 在数字营销的世界里,关键词研究是一个不可或缺的环节。关键词研究的目的是了解你的目标受众在搜索引擎上使用的具体词语和短语,从而帮助你创建内容和优化网站,使其在搜索结果中排名更高。很多人对于关键…...
避坑指南:vLLM多模型部署中那些官方文档没告诉你的显存管理技巧
vLLM多模型部署中的显存优化实战:从参数调优到生产级解决方案 在当今大模型推理领域,vLLM凭借其高效的PagedAttention技术和出色的吞吐性能,已成为众多企业首选的推理框架。然而在实际生产环境中,特别是多模型并行部署场景下&…...
NaViL-9B开源大模型教程:统一prompt接口处理文本/图文输入逻辑
NaViL-9B开源大模型教程:统一prompt接口处理文本/图文输入逻辑 1. 模型简介 NaViL-9B是由国内领先研究机构发布的开源多模态大语言模型,具备同时处理文本和图像输入的能力。与传统的单模态模型不同,它通过统一的接口实现了文本问答和视觉理…...
WireShark4.0安装后必做的5项安全设置(Win10网络工程师实操版)
WireShark 4.0专业级安全配置指南:企业网络工程师的5项核心优化 在企业级网络环境中,WireShark早已超越了简单的抓包工具定位,成为网络故障排查、安全审计和协议分析的多面手。但鲜有人意识到,默认安装配置下的WireShark可能成为网…...
LightRAG深度解析:如何通过双级检索与图结构优化RAG系统性能?
1. LightRAG如何解决传统RAG的痛点 如果你用过传统的RAG(检索增强生成)系统,肯定遇到过这样的场景:明明数据库里有相关资料,但系统就是找不到关键信息;或者检索结果虽然相关,但缺乏上下文关联性…...
嵌入式方向输入抽象库:摇杆与按键的语义化状态映射
1. 项目概述direction是一个轻量级、零依赖的嵌入式方向输入抽象库,专为资源受限的微控制器(如 STM32F0/F1/L0/L1、nRF52、ESP32-C3、RP2040 等)设计。其核心目标并非实现复杂的人机交互逻辑,而是以最小的代码体积和确定性的执行时…...
