@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)相关推荐

  1. JavaScript数据结构与算法——数组详解(下)

    1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...

  2. 数据结构与算法--数组中出一次的数字

    数组中出现一次的数字 题目:一个整型数组里面除了一个数字以外,其他数字都出现了两次.找出这个出现一次的数字,时间复杂度O(n),空间复杂度O(1) 如上题中最简单的方法就是一次循环统计,之后在循环判断 ...

  3. 数据结构与算法--数组中的逆序对

    题目:在数组中的两个数字如果签名一个数字大于后面的数组,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 案例:输入数组{7,5,6,4}中一共有5个逆序对分别是{7,6},{ ...

  4. 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)

    时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...

  5. 数据结构与算法--数组:二维数组中查找

    数组 数组最简单的是数据结构,占据一整块连续的内存并按照顺序存储数据,创建数组时候,我们需要首先指定数组的容量大小,然后根据大小分配内存.即使我们只在数组中存储一个元素,亚需要为所有数据预先分配内存, ...

  6. JavaScript数据结构与算法——数组详解(上)

    1.JS中的数组 JS中的数组是一个特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,但是这些数字索引会在内部转换成字符串类型(因为JS对象中的属性名必须是字符串).数组在JS中只是一种 ...

  7. Java数据结构和算法-----数组

    1.Java数组介绍 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型(Object类型数组除外). ①.数组的声明 第一种方式: 1 数据类型 []  数组名称 = ne ...

  8. java 二维链表_Java数据结构与算法----数组与链表

    数据类型 1 数据类型介绍 数据类型的分类(按照结构划分):线性结构和非线性结构 线性结构:线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序 ...

  9. 数据结构与算法-数组

    数组是应用最广泛的一种数据结构,常常被植入到编程语言中,作为基本的类型来使用,因此在一些介绍数据结构的文章中,数组没有被当做一种数据结构单独拿出来讲解.鉴于大家对数组都不陌生,可以将其作为学习数据结构 ...

最新文章

  1. 栈的输出_栈和队列--十进制转化为二进制
  2. 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...
  3. 用实例给新手讲解RSA加密算法
  4. 1.23 实例:正则表达式验证IP地址
  5. html游戏闪,HTML最简单的文字闪烁代码
  6. thinkphp gd 添加文字
  7. fopen_s不接受两个参数_如何利用SPC来管理制造过程,不懂SPC还敢混“质”场?
  8. 模板共享指针(shared_ptr)原理实现
  9. 转发 微博 Qzone 微信 基础知识|存储相关的名词
  10. 官方数据:程序员年纪越大越出色、越稀有
  11. 循环体(for/while)循环变量的设置
  12. POJ2559最大矩形面积——单调栈
  13. 无人驾驶入门1:无人驾驶概览
  14. sharepoint 2010如何下载文件
  15. 数据库维护计划中出现错误,数据库无法自动备份。 错误提示:作业失败。所有者(XXX\administrator用户拥有DB维护计划“数据库备份”作业)没有服务器访问权限。
  16. 好把旧书多读到 义言一出见英明
  17. 提高排名的 15 个基本 SEO 技巧
  18. python编写游戏测试机器人客户端(一)
  19. OCJP 1Z0-808考题解析 题31--60
  20. Redis集群节点的变更

热门文章

  1. php SqlServer 中文汉字乱码
  2. [Leetcode] Permutations 全排列
  3. 使内嵌式jetty服务器支持jsp
  4. CentOS更换网卡设置
  5. android-apt-compiler: Cannot run program D:\android-sdk\platform-tools\aapt
  6. 周立波贼经典的话31-40
  7. 浅析IT软件项目团队人力资源管理
  8. 离开当前屏幕的判断方法_EXCEL 一个工作表如何快速拆分多个工作表的方法
  9. helm添加仓库命令:helm repo add带用户名密码
  10. kubectl更换镜像命令