数据结构-数组

132 阅读3分钟

一.什么是数组

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

二.数组的特点

    注意到数组在定义时有两个关键词,第一个是线性表,第二个是连续内存空间

2.1 线性表

    线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其是以线性
表为结构的数据结构还有链表,队列,栈等。

2.2 连续内存空间

    这个概念很好理解就是字面意思,在内存中给分配一块连续的内存空间,正式因为这个限制,所以数组
有了随机访问这个非常实用的特性。但是事情往往都是具有双面性的,而放在数组这块就表现为,在往数组
里删除和新增数据时为了保证内存的连续性需要作大量的数据搬迁的工作。

三.操作数组

3.1 随机访问数组

    使用过数组的都知道数组可以基于下标来随机访问数组的任何一个元素,那么数组时根据什么来实现
这个功能的呢。我们以int[] array = new int[5]来举例说明一下,首先在我,们创建这个数组时会向
计算机内存里面申请一块连续的内存假如内存初始值是100那么array的内存区间对应的就是100-119如下
图所示,其中array[0]指向的内存地址为100,也就是数据的初始内存地址暂且称为base_address吧

    那么最终是怎么寻找到想要找的元素呢,其实计算机是通过访问内存地址来访问数据的,那么当需要
得到某个数据时就会先通过下面这样一个公式array[i]_addr = base_address + i*type_size;其中
type_size是数组中存放的数据类型的大小,本例中假如需要得到array[3],算出array[3]_addr=112-11
5,然后直接从内存中拿数据就ok。

3.2数组中插入和删除数据

    带着问题我们去学习数组的插入和删除,我们知道数组插入和删除低效,那么为什么呢?
    假如存在数组int[] a = new int[n];往数组k位置插入一个新数据,那么计算机都会做哪些工作呢;
如下图:

    分析一下,如果要往k这个位置插入数据,那么给k这个位置腾出空间就需要将k->n之间的元素全部移
动一个位置,如果k是数组末尾的话那么时间复杂度是O(1),如果不是的话时间复杂度就是O(n),所以这下明
白为什么给数组插入数据效率比较低。
    同理其实删除和插入是同一个道理,为了保存内存的连续性,删除是将k->n之间的元素像前移动一位

4.结束语

    数组到这就学习完了,那么我在这抖个机灵,数组为什么下标识从0开始的计算的,其中除了历史原因
还有其他解释吗?希望大家在评论区留言。
    最后申明:本文所有的实例都是参靠极客时间王争老师的数据结构与算法之美来列举的,本文只做自己学习
使用,不做其他任何商业用途。

5.参靠文献

https://time.geekbang.org/column/article/40961