数据结构与算法 / 数组(Array)
@time 2019-07-18
@author Ruo_Xiao
@notice 64位OS
一、基础知识
1、数组的定义
数组是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同数据类型的数据。
2、连续的内存空间和相同的数据类型
这种数据的组织方式,直接导致了数据具有核心特性:随机访问。
实现公式(寻址公式)如下:
a[i]_address = a_address + i * type_size
通过上述公式,也能够明白为什么数组的下标为什么从0开始。若从1开始的话,那么上述公式就变成了
a[i]_address = a_address + (i - 1) * type_size
像数组这种编程语言最底层的数据结构,性能必须优化到极致,所以采用了下标从0开始的模式。
拓展:二维数组的寻址公式为
// 假设二位数组为 m * n
a[i][k]_address = a_address + (i * n + k) * type_size
二、相关操作
为了保持内存空间的连续性,数组的插入和删除是低效的,因为操作之后要进行数据迁移。
1、插入
- 插入的位置在队尾,时间复杂度为 O(1) 。
- 插入的位置在队首,时间复杂度为 O(n)。
- 平均复杂度,因为插入的位置是随机的,即:概率相同。所以,平均复杂度为
(1 + 2 + 3 + …… + n) / n = ( n + 1 ) * n / ( 2 * n ) = (1/2)n + (1/2) = O(n)
- 如果对数组的顺序没有要求,那么可以将插入的位置的原数据放入数组末尾,将新数据赋值到该位置,时间复杂度为O(1) 。为 O(1) 的原因是该操作不会随着数组元素数量的变大而变大,执行的指令数量相同,所以复杂度为 O(1) 。
2、删除
- 删除的位置在队尾,时间复杂度为 O(1) 。
- 删除的位置在队首,时间复杂度为 O(n)。
- 平均复杂度为 O(n) 。计算过程参考 “插入” 部分。
- 很多时候,为了追求软件性能,可以将数组中待删除的数据标记为已删除状态,然后定时对已经删除的数据进行集中删除操作,这种思想类似于 JVM 的垃圾回收机制。
其实上述操作,在 C++ 中 vector 早已封装好,所以在 C++ 编程中,推荐使用vector代替数组。当然了,那些对于性能有卓越的追求的领域,数组还是无可替代的。
(SAW:Game Over!)
数据结构与算法 / 数组(Array)相关推荐
- JavaScript数据结构与算法——数组详解(下)
1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...
- 数据结构与算法--数组中出一次的数字
数组中出现一次的数字 题目:一个整型数组里面除了一个数字以外,其他数字都出现了两次.找出这个出现一次的数字,时间复杂度O(n),空间复杂度O(1) 如上题中最简单的方法就是一次循环统计,之后在循环判断 ...
- 数据结构与算法--数组中的逆序对
题目:在数组中的两个数字如果签名一个数字大于后面的数组,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 案例:输入数组{7,5,6,4}中一共有5个逆序对分别是{7,6},{ ...
- 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)
时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...
- 数据结构与算法--数组:二维数组中查找
数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...
- JavaScript数据结构与算法——数组详解(上)
1.JS中的数组 JS中的数组是一个特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,但是这些数字索引会在内部转换成字符串类型(因为JS对象中的属性名必须是字符串).数组在JS中只是一种 ...
- Java数据结构和算法-----数组
1.Java数组介绍 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型(Object类型数组除外). ①.数组的声明 第一种方式: 1 数据类型 [] 数组名称 = ne ...
- java 二维链表_Java数据结构与算法----数组与链表
数据类型 1 数据类型介绍 数据类型的分类(按照结构划分):线性结构和非线性结构 线性结构:线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序 ...
- 数据结构与算法-数组
数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本的类型来使用,因此在一些介绍数据结构的文章中,数组没有被当做一种数据结构单独拿出来讲解.鉴于大家对数组都不陌生,可以将其作为学习数据结构 ...
最新文章
- 栈的输出_栈和队列--十进制转化为二进制
- 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...
- 用实例给新手讲解RSA加密算法
- 1.23 实例:正则表达式验证IP地址
- html游戏闪,HTML最简单的文字闪烁代码
- thinkphp gd 添加文字
- fopen_s不接受两个参数_如何利用SPC来管理制造过程,不懂SPC还敢混“质”场?
- 模板共享指针(shared_ptr)原理实现
- 转发 微博 Qzone 微信 基础知识|存储相关的名词
- 官方数据:程序员年纪越大越出色、越稀有
- 循环体(for/while)循环变量的设置
- POJ2559最大矩形面积——单调栈
- 无人驾驶入门1:无人驾驶概览
- sharepoint 2010如何下载文件
- 数据库维护计划中出现错误,数据库无法自动备份。 错误提示:作业失败。所有者(XXX\administrator用户拥有DB维护计划“数据库备份”作业)没有服务器访问权限。
- 好把旧书多读到 义言一出见英明
- 提高排名的 15 个基本 SEO 技巧
- python编写游戏测试机器人客户端(一)
- OCJP 1Z0-808考题解析 题31--60
- Redis集群节点的变更
热门文章
- php SqlServer 中文汉字乱码
- [Leetcode] Permutations 全排列
- 使内嵌式jetty服务器支持jsp
- CentOS更换网卡设置
- android-apt-compiler: Cannot run program D:\android-sdk\platform-tools\aapt
- 周立波贼经典的话31-40
- 浅析IT软件项目团队人力资源管理
- 离开当前屏幕的判断方法_EXCEL 一个工作表如何快速拆分多个工作表的方法
- helm添加仓库命令:helm repo add带用户名密码
- kubectl更换镜像命令