| |
|
开发:
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 语言为例,如下:
该数组在内存的示意图,如下: 计算机会给每一个内存单元分配一个地址,并通过地址来访问内存中的数据。当计算机要访问数组中的某个元素的时候,就会通过下面公式寻找对应的地址:
请注意,data_type_size 表示的是数组中每个元素的大小,这里数组是 int 类型,因此 data_type_size = 4。 3、数组的删除和插入操作插入操作: 假如数组的长度为 n,如果我们需要将一个数据插入到数组中的第 k 个位置,为了把第 k 个位置腾出来,需要把第 k~n 这部分的元素都顺序的往后挪一位,操作复杂。 考虑最好和最坏的情况的话,如果在数组的末尾插入元素,那就不需要移动数据了,插入比较简单,如果在数组的头部插入元素就复杂了,需要把所有的数据都往后移动一位。 如果一个数组中的数据是有序的,那我们在某一个位置插入一个新的元素的时候,就必须得按照上面的方法移动 k 之后的数据,但是数组中存储的数据没有任何规律,这时候,如果想要把某个元素插入到k位置,为了避免大规模的数据搬移,有个简单的办法就是:直接把 k 位置的数据搬到数组的最后面,把新元素放到第 k 个位置。 删除操作: 与插入操作类似,如果我们要删除第 k 个位置的数据,为了保证内存的连续性,也需要移动数据,不然中间就会出现空洞。 在某些情况下,如果我们不要求数据必须是连续的,那么删除的时候可以不真删除,只是把这个元素标记为已删除,当数组空间不够用的时候,在触发一次真正的删除,这样就大大减少了删除操作导致的移动操作。 Java ArrayList1、ArrayList的使用说明Java 中的 ArrayList 相当于一个动态数组,支持元素有序的重复的存储,支持扩容。它可以把很多数组操作的细节封装起来,比如插入和删除操作。 数组在定义的时候,因为需要给它分配连续的内存空间,需要预先指定其大小,当存放的数据大于其大小的时候,我们需要从新分配一块更大的空间,把原来的复制过去在插入新的元素。 ArrayList 中,当空间不够用的时候,它会自动扩容为原来的1.5倍的大小。因为扩容设计到内存的申请和数据的搬移,这是比较耗时的,所以,如果事先能确定数据的大小,做好在创建 ArrayList 的时候指定其大小。 虽然 ArrayList 比数组好用,不过有些时候使用数组会更好一些,原因有:
在开发中,一般情况下直接使用 ArrayList 就可以。如果是偏底层的开发,比如网络框架开发等是需要更高的性能,选用数组实现更合适。 2、ArrayList源码分析在 Java 语言中,ArrayList 集合是一个很重要的数据结构,是必知必会的知识点,其中自动扩容机制,遍历的陷阱,ArrayList 集合增删慢/查询快的原因,Java8 新增 API,ArrayList 集合安全问题等都是很重要的内容,这里不再赘述,可以参考我的另一篇博客。 数组相关的算法1、数组常见的排序算法数组常见的排序算法有:冒泡排序、 选择排序、插入排序、折半排序(快速排序)、希尔排序、归并排序等。 【排序算法】常见排序算法总结 里详细的介绍过这些排序算法的 Java 语言实现,可以参考,这里不再赘述。 2、算法刷题这里收集到了一些算法题目,可作为练习使用,实现不限于某种编程语言。 题目1:数组合并 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组? 题目2:数组排序 如何重新排列整型数组中的正值和负值元素? 题目3:寻找重复 如何找出数组中第一个重复的元素? 题目4:寻找最值 如何寻找到整型数组中第 N 个小的元素? 题目5:二维数组 使用二维数组,如何实现杨辉三角? 扩展:使用二维数组,如何实现回形数?(回形数指的是,从键盘输入一个整数(1~20),则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中而构成) 题目6 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。 题目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。 以上题目的思路和实现代码,不再本篇提供,以后会陆续更新到其他文章。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |