数据结构-----数组:

1.数组中的概念:是一种线性表数据结构,使用连续的内存空间来存储类型相同的数据。

(1)线性表:数据排列成一种线形结构 ,如(数组,链表,栈,队列)。非线性表:(树,图,堆)

2.数组是如何实现根据下标索引随机访问数据元素的 ?

数组支持随机访问,根据数组下标随机访问的时间复杂度为O(1),而不是说访问数组的时间复杂度为O(1),因为即使为排好序的数组,采用二分查找算法,时间复杂度也是O(logn)。

因为数组采用的是连续的内存存储空间,所以在数组中间插入和删除数据元素时,之后的元素会进行搬移工作。

以int 类型的数组为例:int [ ]  array = new int [10] ; 假设 该数组中的第一个元素的地址为 1000 ,记为 base_address

data_type_size 为数组中每个元素所占内存的大小 ,如:int 类型的数据 占4个字节。

所以随机访问数组中某一个元素的寻址公式为:a[ i ]_address = base_address + i * data_type_size

3. 改进数组中低效的“插入”和“删除”操作的方法:

(1)插入:前提条件(不需要关注数组中元素的顺序时):例如 需要将一个新的元素插入到第k个元素的位置,为了避免k和k之后的元素全都向后移动,可以将第k个元素移动到数组的最后一位,然后将新的元素插入到第k个元素的位置

基于这种操作,在第k个位置插入新的元素的时间复杂度为O(1),在快速排序中也有用到这种思想。

(2)删除数据时:前提条件(不要求数组中数据的连续性):因为在数组中间某一个位置执行删除操作的话,每执行一次都会移动一次数据,对性能产生影响,如果我们可以采用将多次删除操作集中处理的话,

例如 如果想要删除 a b c 三个元素,那么我们可以先记录下来需要删除的数据,当数据的空间不足时,在执行一个总的删除操作,效率会有所提高。

这种操作也是采用到了JVM GC 中的标记清除算法。

4. 数组的访问越界问题:

例如 一个数组 arr[] 中 有三个元素,但是访问了第四个元素,那么程序是否报错取决于编译器,比如在C语言中,程序会出现无限循环的状态,但是在Java中,就会出现数组索引越界异常。

5. 使用Java中容器和基础数组的场合:

Java中基于数组实现的容器,如 ArrayList ,他在底层封装了数组的动态扩容,添加和删除操作,如果在进行业务开发中使用ArrayList时,如果可以提前确定数组的容量,那么在初始化时,尽量声明容器的容量,避免频繁的扩容操作。如果时进行底层的功能开发,那么采用基础的数组比较好。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值