04数组

数组详解
本文深入解析了数组这一基础数据结构,包括其定义、通过下标访问的原理、插入与删除操作的复杂度分析,以及与容器如ArrayList的对比。同时探讨了数组编号从0开始的历史与技术原因。

1.定义

1.1概念

数组:是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

线性表:线性表就是数据排成像一条线一样的结构,每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表,队列,栈等也是线性结构。
在这里插入图片描述

而与他对立的概念是非线性表,比如二叉树,堆,图。之所以叫非线性,是因为,在非线性表中,数据之前并不是简单的前后关系。

在这里插入图片描述

连续的内存空间和相同的数据类型:有此特性,才可实现随机访问。但是在插入和删除时,为保持内存连续性,需要做大量的数据搬移工作。

1.2如何通过下标随访访问?

拿一个长度为10的int类型数组 int[] a = new int[10]举例。下图中,计算机给数据a[10], 分配了一块连续内存空间1000~1039,其中,内存块的首地址为base_address=1000.
在这里插入图片描述
技术机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组的某个数组中的元素时,它会首先通过下面的寻址公司,计算该元素存储的内存地址:

a[i]_address = base_address + i * data_type_size

其中 data_type_size 表示数组中每个元素的大小。在这里,array中类型为 int, 所以 data_type_size为4个字节。

2.数组插入

假设数组长度为n, 插入的位置为k,则 k 的取值范围为 [0, n-1]。

最好: k最后一个位置,不需要移动数据,复杂度为 O(1).

最坏: k为第一个位置,需要移动n个数据,复杂度为O(n).

平均: 插入arr每个位置的概率是一样的,则 (1+2+3+…n)/n = (n+1)/2 -> O(n)

3.数组删除

假设数组长度为n, 插入的位置为k,则 k 的取值范围为 [0, n-1]。

最好: k最后一个位置,不需要移动数据,复杂度为 O(1).

最坏: k为第一个位置,需要移动n个数据,复杂度为O(n).

平均: 插入arr每个位置的概率是一样的,则 (1+2+3+…n)/n = (n+1)/2 -> O(n)

4.容器与数组比较

容器(比如ArrayList等)是否能够完全替代数组?ArrayList的优势

  • 动态扩容
  • 封装对数组的操作细节,操作便利

5.数组编号为啥从0开始

5.1 原因1

从数组存储的内存模型上看,“下标”最确切的定义是“偏移(offset)”。下标从0开始的寻址公式:

a[k]_address = base_address + k * type_size

但是,如果数组从1开始计数,计算数组元素a[k]的内存地址会变为:

a[k]_address = base_address + (k-1) * type_size

两者的区别是,从1开始,cpu多了一次 (k-1)的减法指令。数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

5.2 原因2

历史原因,C语言从0开始。

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究”展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
### VBA数组的定义与声明 在VBA中,数组是一种可以存储多个相同类型数据的数据结构。数组的定义和声明是使用数组的第一步,它决定了数组的大小、类型以及是否为静态或动态数组。声明数组的基本语法如下: ```vb Dim arrayName() As DataType ``` 这里,`arrayName`是你给数组起的名字,`DataType`指定了数组可以存储的数据类型。如果想要声明一个固定大小的数组,可以在括号内指定大小: ```vb Dim arrayName(1 To 10) As DataType ``` 如果希望数组的索引从1开始而不是默认的0,可以在模块的声明部分加入`Option Base 1`语句[^3]。 ### VBA数组的操作方法 一旦数组被正确声明,接下来就可以对其进行各种操作,包括初始化、访问元素、修改数组内容等。初始化数组通常涉及给数组的每个元素分配初始值。例如: ```vb Dim NumArray(3) As Variant NumArray(0) = "VBScript" NumArray(1) = 1.05 NumArray(2) = 25 NumArray(3) = #23/04/2013# ``` 上述代码段展示了如何初始化一个包含不同数据类型的数组。值得注意的是,由于数组元素的数据类型被声明为`Variant`,因此它可以存储不同类型的数据[^5]。 对于动态数组,其大小可以在运行时通过`ReDim`语句调整。如果需要保持已有的数组数据,在重新定义数组大小时应使用`Preserve`关键字: ```vb ReDim Preserve DynamicArray(15) ``` 这样可以确保在扩展数组大小的同时保留原有的数据[^4]。 ### 数组的遍历 处理数组时,经常需要遍历数组的所有元素。这通常通过循环实现,如`For...Next`循环: ```vb Dim i As Integer For i = LBound(NumArray) To UBound(NumArray) Debug.Print NumArray(i) Next i ``` 这里的`LBound`和`UBound`函数分别用于获取数组的最小和最大索引值,这对于处理不确定边界的数组特别有用[^1]。 ### 清除数组 当不再需要数组中的数据时,可以使用`Erase`语句来清除数组的内容。对于固定大小的数组,这会将所有元素重置为其默认值(例如,数值类型会被设为0,字符串会被设为空字符串)。对于动态数组,`Erase`还会释放数组占用的内存空间: ```vb Erase NumArray Erase DynamicArray ``` 以上就是VBA数组的一些基本定义、声明和操作方法。掌握这些基础知识有助于更有效地利用数组来处理复杂的数据集。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值