数据结构(一):数组

一、概述

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

    • 线性表数据结构:数据排成像一条线那样的线性结构

    • 连续的内存空间:数据在内存里面的存储空间是连续的一块内存

    • 具有相同类型:数组里面的所有数据的数据类型是相同的

  • 示例代码

    • int[] array = new int[3];
    • 由上述代码我们可以看出来,使用数组我们需要指定数组的长度

    • Array数组是无法动态扩容的,我们需要预先指定它的长度

二、图示结构

  • 上图是数组简单的结构,图中的内存地址是为了方便假设的地址,真实的内存地址要比这复杂

三、操作数组的时间复杂度

  • 查询

    • 我们可以直接通过array[index]的方式来访问数组,所以数组查询的时间复杂度为O(1)

  • 插入

    • 由上图我们可以看出来,在数组指定位置插入一个元素,这个位置之后的所有数据都要往后挪一个位置,所以这种情况的时间复杂度为O(n);

    • 最理想的状态下是在该数组的尾部插入一个元素,这样一个元素都不用挪动,这时的时间复杂度为O(1)

    • 综上,数组插入的时间复杂度为:O((n-1)/2)==>O(n)

  • 删除

    • 删除数组中指定位置的一个元素,删除之后,这个位置之后的所有数据都要向前挪动一个位置,这时时间复杂度为O(n)

    • 如果是删除数组尾部的元素的话,数组中元素都不用挪动,这个时候时间复杂度为O(1)

    • 综上,在数组中删除一个元素的时间复杂度为O(n)

四、动态数组(ArrayList)

  • 基本概念和用法:

    • ArrayList可以动态的进行扩容,我们在声明时不需要指定它的长度

    • ArrayList不存储基本数据类型,它存储的是基本数据类型的封装类型

    • 如果声明的时候不指定类型的话,它是可以存储多种类型的数据的

ArrayList list = new ArrayList();
list.add(1 );
list.add("元素");

  • 注意事项:

    • 因为ArrayList是动态扩容的,当空间不够用时它会自动扩容,自动扩容是要消耗计算机资源的,所以如果我们的数组大小长度是确定的,优先使用Array数组

    • 因为ArrayList存储的是基本数据类型的封装类型,所以该数组的存取是需要进行拆箱和装箱操作的,这一点相比Array而言也是比较消耗性能

转载请注明出处:https://www.cnblogs.com/Infancy/p/12591445.html

猜你喜欢

转载自www.cnblogs.com/Infancy/p/12591445.html