数组-数据结构与算法

1.数组是很多编程语言中最基础的数据结构,下面来一起温习下
2.数组示例:

 int[] a = new int[10]; //定义数组
 a[0] = 5;              //数组赋值,
 int v1 = a[0];         //访问数组, v1=5 ,下标从0开始

3.数组如何实现随机访问?

  • 1.内存中所有的空间都是按格子排列好的,每个格子占一个字节byte,且都有一个地址,通过地址访问到格子中的内容
  • 2.程序创建数组时,会在内存中申请连续的空间,并记录数组的首个格子地址 base_address
  • 3.程序中每种数据类型type_size 都占用不同字节byte,如:int占4个字节,char2个字节
  • 3.访问数组a[0]时,会通过该公式一步计算出地址:a[0]_address = base_address + i * type_size 拿到存储的数据

4.为什么下标从0开始?我觉得有2个原因

  • 1.如果不从0开始,计算公式是:a[0]_address = base_address + (i -1) * type_size,CPU是按指令计算单的,此时多了一次减法运算,对于常用的数组,每次多一步计算是可以优化的
  • 2.历史原因,C语言的设计者设计数组时是从0开始的,java等语言也仿照

5.在Java中有ArrayList容器,它比数组多了很多api去操作数据,最重要的是支持自动扩容,数组申请好后容量是不能改变的,ArrayList容器添加内容时,判断是否达到阈值,会自动新建数组,并把之前的内容全部复制到新数组中,并添加内容,如果扩容次数很多,会消耗性能,如果在创建容器时大概知道数据量,则可以指定容器长度,List list = new ArrayList(100);

6.如果对性能要求很高的操作,如网络编程等,可以使用数组

7.数组有访问、添加、插入、删除操作

  • 1.访问:通过下标访问一步到位,时间复杂度为 O(1)
  • 2.添加:数据添加到末尾一步到位,时间复杂度为 O(1)
  • 3.插入:数据插入到末尾一步到位,时间复杂度为 O(1),数据插入到第一位置则需要把内容全部向后移动一位再插入数据,时间复杂度为 O(n)。如果对数据的顺序没有要求,可以把插入位置的内容先移动到数组末尾,再把值插入到该位置,此时时间复杂度为 O(1)
  • 4.删除:删除最后一个数据,时间复杂度为 O(1),数据第一个数据,时间复杂度为 O(n)

8.数组是线性表的一种,线性表就是数据排成像一条线一样的结构。数组,链表、队列、栈等也是线性表结构
在这里插入图片描述

9.非线性表有二叉树、堆、图等。之所以叫非线性,是因为在非线性表中,数据之间并不是简单的前后关系
在这里插入图片描述
10.稀疏数组:稀疏数组是数组的一种应用,可以把原始数组的内容进行压缩,再还原出来,比如下五子棋,下棋存档操作,原始棋盘需要存储 11行 * 11列,存为稀疏数组就只需要存储 3行 * 3列的数据,恢复时再转换回来即可

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页