IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构】数组 -> 正文阅读

[数据结构与算法]【数据结构】数组

数组概念

1、数组的定义

每一种编程语言中,基本都会有数组,它是一种线性表的数据结构,用一组连续的内存空间来存储一组具有相同类型的数据。

这里,线性表是数据排列成一条线一样的结构,每个线性表上的数据最多只有前和后两个方向。连续的内存空间和相同的数据类型,有了这两个限制,才能让数组可以随机访问。当然有利就有弊,这也让数组的很多操作变得低效,比如,删除和插入操作,为了保证连续性需要做大量的数据移动操作。

一维数组可以看作一个线性表,一维数组的元素有1个下标,如 a[5]。二维数组也可以看作一个线性表X=(X0,X1,X2,…,Xn-1),只不过每一个数据元素 Xi 也是一个线性表,二维数组的元素中有 2 个下标,如 a[1][5]。

无论是一维还是二维,数组是在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从 0 开始。

高维数组并不常用,不必深入了解。因此,后面所提及的数组不特指的话,默认的是一维数组

2、数组如何根据下标实现随机访问的?

假如有一个长度为10的 int 类型的数组,以 Java 语言为例,如下:

int[] a = new int[10]

该数组在内存的示意图,如下:
在这里插入图片描述
从图中可以看到,计算机给数组a分配了一块连续的内存1000-1039,其中内存块的首地址为base_address=1000。

计算机会给每一个内存单元分配一个地址,并通过地址来访问内存中的数据。当计算机要访问数组中的某个元素的时候,就会通过下面公式寻找对应的地址:

a[i]_address = base_address + i*data_type_size

请注意,data_type_size 表示的是数组中每个元素的大小,这里数组是 int 类型,因此 data_type_size = 4。

3、数组的删除和插入操作

插入操作:

假如数组的长度为 n,如果我们需要将一个数据插入到数组中的第 k 个位置,为了把第 k 个位置腾出来,需要把第 k~n 这部分的元素都顺序的往后挪一位,操作复杂。

考虑最好和最坏的情况的话,如果在数组的末尾插入元素,那就不需要移动数据了,插入比较简单,如果在数组的头部插入元素就复杂了,需要把所有的数据都往后移动一位。

如果一个数组中的数据是有序的,那我们在某一个位置插入一个新的元素的时候,就必须得按照上面的方法移动 k 之后的数据,但是数组中存储的数据没有任何规律,这时候,如果想要把某个元素插入到k位置,为了避免大规模的数据搬移,有个简单的办法就是:直接把 k 位置的数据搬到数组的最后面,把新元素放到第 k 个位置。

删除操作:

与插入操作类似,如果我们要删除第 k 个位置的数据,为了保证内存的连续性,也需要移动数据,不然中间就会出现空洞。

在某些情况下,如果我们不要求数据必须是连续的,那么删除的时候可以不真删除,只是把这个元素标记为已删除,当数组空间不够用的时候,在触发一次真正的删除,这样就大大减少了删除操作导致的移动操作。

Java ArrayList

1、ArrayList的使用说明

Java 中的 ArrayList 相当于一个动态数组,支持元素有序的重复的存储,支持扩容。它可以把很多数组操作的细节封装起来,比如插入和删除操作。

数组在定义的时候,因为需要给它分配连续的内存空间,需要预先指定其大小,当存放的数据大于其大小的时候,我们需要从新分配一块更大的空间,把原来的复制过去在插入新的元素。

ArrayList 中,当空间不够用的时候,它会自动扩容为原来的1.5倍的大小。因为扩容设计到内存的申请和数据的搬移,这是比较耗时的,所以,如果事先能确定数据的大小,做好在创建 ArrayList 的时候指定其大小。

虽然 ArrayList 比数组好用,不过有些时候使用数组会更好一些,原因有:

  • 因为 ArrayList 无法存储基本类型,int、long 等需要封装成 Integer、Long 类,而自动装箱和拆箱的操作也会有一定的性能消耗,所以如果关注性能或者想用基本类型的话就选用数组;
  • 如果数据的大小已经知道,并且对数据的操作简单,可以直接使用数组;
  • 当使用多维数组的时候,用数组表示起来更加直观,比如二维数组 int[][]arr ,而用容器的话则需要这样定义 ArrayList arr 。

在开发中,一般情况下直接使用 ArrayList 就可以。如果是偏底层的开发,比如网络框架开发等是需要更高的性能,选用数组实现更合适。

2、ArrayList源码分析

在 Java 语言中,ArrayList 集合是一个很重要的数据结构,是必知必会的知识点,其中自动扩容机制,遍历的陷阱,ArrayList 集合增删慢/查询快的原因,Java8 新增 API,ArrayList 集合安全问题等都是很重要的内容,这里不再赘述,可以参考我的另一篇博客

数组相关的算法

1、数组常见的排序算法

数组常见的排序算法有:冒泡排序、 选择排序、插入排序、折半排序(快速排序)、希尔排序、归并排序等。

排序算法】常见排序算法总结 里详细的介绍过这些排序算法的 Java 语言实现,可以参考,这里不再赘述。

2、算法刷题

这里收集到了一些算法题目,可作为练习使用,实现不限于某种编程语言。

题目1:数组合并

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组?

题目2:数组排序

如何重新排列整型数组中的正值和负值元素?

题目3:寻找重复

如何找出数组中第一个重复的元素?
扩展:如何找出数组中第一个不重复的元素?

题目4:寻找最值

如何寻找到整型数组中第 N 个小的元素?
扩展:如何寻找到整型数组中第 N 个大的元素?

题目5:二维数组

使用二维数组,如何实现杨辉三角?

扩展:使用二维数组,如何实现回形数?(回形数指的是,从键盘输入一个整数(1~20),则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中而构成)

题目6

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
示例,输入:digits = [1,2,3],输出:[1,2,4],解释:输入数组表示数字 123。

题目7

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。示例 ,输入:nums = [1,1,0,1,1,1],输出:3,解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3。

题目8

给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱) 例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6。

以上题目的思路和实现代码,不再本篇提供,以后会陆续更新到其他文章。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:07:02  更:2022-10-08 21:07:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:53:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码