数据结构与算法——数组(基础篇)

博主也是第一次当博主,想要做一名名副其实的程序员,当然本质可能还是个商科生,看到博客的朋友可以一起交流经验,wechat:LYI_1998

数组的定义:

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

!此处应有线性表概念:数据排成一条线,每个线性表上的数据最多只有前后两个方向。常见的线性表数据结构有:数组、链表、队列和栈等。
在这里插入图片描述
!此处应有有疑问,什么是非线性表?其中就有树、堆、图等数据结构。它们的数据之间并不是简单的前后关系,所以是非线性的。
在这里插入图片描述

下面正式介绍数组的使用!

一般我们都是利用数组进行增删查数据,众所周知,数组查询速度较快,插入删除数据较慢,这个是为何?看下面!

数组的查询

根据我学习的专栏《数据结构与算法之美》知识得知,对于下述代码,

int[] arr = new int[10]; 

系统通常会这样分配地址:

一维数组:
a[i]_address = base_address + i *
data_type_size

m*n数组:
a[ i ][ j ](i < m, j < n)的寻址公式为:
a[ i ][ j ]_address = base_address + (i * n + j) * data_type_size

说明:data_type_size表示数组中每个元素的大小,即几个字节

由此得出下图,计算出该元素的内存地址,由下标随机访问数组中的某个元素的时间复杂度为O(1)

在这里插入图片描述

数组的插入

若从第k位插入,则后续所有数据往后移,此举是为了保证内存的连续性。
只记得平均时间复杂度:O(n)
特殊情况提高效率:如果不是有序数组,那么可以直接把第k个位置上的数据移动到最后,然后将要插入的数据放在k位置上,这样时间复杂度就为:O(1)

数组的删除

删除int[n]数组的第k个位置上的数据,需要将k~n之间的数据往后移,这是为了保证内存的连续性。
平均时间复杂度:O(n)
特殊情况:标记统一删除法
类似于Java虚拟机中的垃圾回收算法的思想:先给要删除的元素标记为已删除元素,等到分配的内存空间不够用的时候,给标记为已删除的元素再统一删除掉,这样就可以减少数据搬移的次数。
大多数主流虚拟机采取可达性分析算法来判断对象是否存活,在标记阶段,会遍历所有GC ROOTS,将所有GC ROOTS可达的对象标记为存活。只有当标记成功后清理工作才开始。
不足:
一是效率,标记和清理效率不高,只有少量垃圾产生才高效;
二是空间,会产生不连续的内存空间碎片。
PS:这里借鉴专栏评论区同学通俗易懂的解释:
日常生活中的垃圾,也是标记为垃圾后放进垃圾桶,然后再统一地倒垃圾!!!

数组和容器

数组 容器
存储基本数据类型以及引用数据类型 存储引用数据类型
长度固定 长度可变
存储元素必须为统一数据类型 存储可不唯一数据类型

PS:ArrayList(底层用数组实现)

数组增删查改代码实现

package data_structure;

public class MyArray {
   

//	定义数组以及初始个数
	private int[] array;
	private int size = 0;

	public MyArray() {
   
		// TODO Auto-generated constructor stub
		array = new int[55];
	}

//	插入操作,按顺序
	public void insert(int value) {
   
		int i;
//		比较大小好顺序插入
		for (i = 0; i < size; i++) {
   
			if (array[i] > value) {
   
				break;
			}
		}
//		将插入位置及之后的元素后移一位,最后一位先开始移动
		for (int j = size; j > i; j--) {
   
			array[j] = array[j - 1];
		}
//		将添加元素放置在i处
		array[i] = value;
		size++
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值