大家好,我是王有志。关注王有志,回复DSA获取数据结构和算法学习资源。

从今天开始就进入到数据结构的部分了,整体分为3个部分:线性表,树和图,从认识每种数据结构到它们的高级应用。今天我们先从最简单的线性表和数组开始。

什么是线性表?

线性表是我们工作中最常用的数据结构之一,同时它也是我们接触到的最简单的数据结构。

根据操作节点的自由度,我们可以将线性表分为两大类:非受限线性表受限线性表

  • 非受限线性表:数组,链表
  • 受限线性表:栈,队列

除此之外,字符串也是一种特殊的线性表。

在频繁的使用过程中,你有没有思考过什么是线性表?

我们一起来看下百度百科中线性表的定义:

线性表(linear list),是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表的概念还是很容易理解的,接着来看点头疼的:

线性表中的个数n定义为线性表的长度,n=0时称为空表。在非空表中每个数据元素都有一个确定的位置,如用ai表示数据元素,则i称为数据元素ai在线性表中的位序。
线性表的相邻元素之间存在着序偶关系。如用(a1,…,ai-1,ai,ai+1,…,an)表示一个顺序表,则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱。

这些看起来是不是就有些头疼了?我们举个简单的例子,糖葫芦都吃过吧?如果我说糖葫芦就是一个线性表呢?

我们来看看糖葫芦是不是符合线性表的定义:

  • 相同特性的数据元素:都是山楂;
  • 有限:总共5个山楂;
  • 序列:给山楂编上号就是完整的序列。

很多小伙伴可能忘记了序列的特点,序列存在顺序关系(可以是混乱的顺序,但是要固定)和排成一列(不会有分支,前后一对一的关系)

通过这串糖葫芦,也给出位序,前驱节点和后继节点的解释:

  • 位序:山楂在签子上确定位置的编号,就是通过这个编号可以找到指定的山楂;
  • 前驱节点:以2号山楂为例,排在2号前面的都是前驱节点;
  • 直接前驱节点:还是2号山楂,排在2号山楂,并且紧挨2号山楂的1号山楂就是直接前驱节点;
  • 后继节点:和前驱节点反过来;
  • 直接后继节点:和直接前驱节点反过来。

再通俗点解释,可以用“一根线”穿起来的相同物件(元素),并保持固定顺序的就是线性表。

这样理解起来是不是比定义中的数学符号简单多了?

数组

知道了什么是线性表之后,我们来看线性表中最简单的数据结构:数组。

还记得我们在02.预备知识:概念和存储结构提到的顺序存储结构吗?数组正是使用了顺序存储结构

另外在02.预备知识:概念和存储结构中我们提到过每块内存都有自己的编号。这种顺序存储结构加上内存编号,使得数组具有了强大的随机存取能力。

数组的优点

数组最大的优点就是随机存取的能力,换句话说就是在数据中查找指定下标的元素速度非常快

因为计算机可以通过一步简单的计算得到存储该元素的内存地址:起始地址+下标*类型大小

这是不是数组下标从零开始的原因之一呢?

数组的缺点

计算机的世界中没有能解决一切问题的“银弹”,随机存取的能力不仅仅给了数组快速查找元素的资本,也使得数组在插入和删除元素后必须要“整理”内存,顺序存储结构。

数组在插入元素后,为了保持随机存取的特性,必须要向后移动元素。

数组在删除元素后,为了保持随机存取的特性,必须要向前移动元素。

当然,也并不是全部的插入删除都要移动元素。最好的情况下,在数组的尾部插入和删除元素,不需要移动任何元素,此时的时间复杂度是O(1)O(1)O(1)。如果是最坏的情况,需要在数组的头部插入和删除元素,则要移动整个数组,此时的时间复杂度是O(n)O(n)O(n)。

除了数组的插入和删除外,还有一种情况我们不得不考虑,如果我们在插入元素时,紧邻数组的内存已经被分配了怎么办?

数组的扩容

我们先来看一段代码:

// 第一种
int numbers1 = {0, 1, 2};// 第二种
int numbers2 = new int[3];// 第三种
int[] numbers3 = {};
numbers3[0] = 0;
numbers3[1] = 1;
numbers3[2] = 2;

这3种创建数组的代码,哪个会有编译时异常?哪个会有运行时异常?

答案是,都能通过编译,但是第三种在运行时会抛出ArrayIndexOutOfBoundsException异常。

强制要求创建数组时进行初始化或者指定数组大小,是为了能够给数组分配合适的内存。但是这么做就带来另一个问题,创建数组时,大小已经固定,如果想添加更多的元素该怎么办?

相信你一定非常熟悉ArrayList了吧?

ArrayList正是Java中提供的可动态扩容的数组,它的底层是Object[],扩容的方式也非常的“粗暴”,当数组大小不足时,重新申请内存(1.5倍),将原数组元素拷贝到新的数组上,并修改引用。

结语

数组的内容就到此结束了,仅仅从数据结构的角度来看数组,还是非常简单的。

可能很多小伙伴会说,工作中都是使用ArrayList了,数组要退出舞台了。

我的想法是,大部分场景选择ArrayList是没有任何问题的,在追求极致性能,且没有插入删除的场景时,数组或许会是一个不错的选择。

练习

  • 尝试实现一个动态数组
  • 1.两数之和
  • 53.最大子数组和
  • 88.合并两个有序数组

好了,今天就到这里了,Bye~~

07.数据结构:线性表入门相关推荐

  1. 数据结构-线性表之用队列实现栈用栈实现队列

    文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...

  2. 数据结构-线性表之带头结点的双向循环链表

    文章目录 前言 实现 (1)结构定义 (2)基本函数 (3)操作实现 测试 代码 前言 链表的类型有很多种(根据带头或不带头,循环或非循环等等),但是我们重点研究的只有两种,一种结构非常简单是无头单向 ...

  3. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)

    [简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT  List { 数据 ...

  4. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?

    王道数据结构线性表:有读者认为直接去掉p结点会造成断链? 我用图解的方式来说明一下,文字有点多,看起来比较眼疼,但是内容不多,希望能对你有帮助. 书上的代码 解释 (ps:对上面解释的一点补充↓)

  5. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

  6. 数据结构-线性表(严书代码实现)

    数据结构-线性表的顺序表示代码 //头文件内容实现 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED #include<string.h ...

  7. 数据结构-线性表-思维导图+小结

    数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...

  8. 数据结构线性表基本操作

    数据结构线性表基本操作 基本内容 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1.顺序表的初始化 2.取值 3.查找 4.插入 5.删除 线性表的链式表示和实现 单链表的定义 ...

  9. c语言构造一个空线性表l,数据结构线性表顺序结构的定义与实现C语言-Go语言中文社区...

    大家好,今天给大家总结了一下数据结构里面的线性表的顺序结构,顺序表表示的是用一组地址连续的存储单元依次存储线性表的数据元素,所以顺序结构的实现一般采用数组的方式来实现,存储空间也采用动态分配的方式.在 ...

  10. 数据结构——线性表(2)

    上接 数据结构--线性表(1) 上文中介绍了线性表的顺序存储结构和单链表的介绍与代码实现,接下来,继续介绍线性表的链式存储 循环链表   在座的各位都很年轻,不会觉得日月如梭.可上了点年纪的人,比如我 ...

最新文章

  1. SAP MM 执行事务代码MRRL报错-No message was found for partner 100065 company code 0001-
  2. s:select 使用
  3. 不支持mac os x软件虚拟化。要运行mac os x,您需要主机VMware workstation支持硬
  4. Android Activity形象描述
  5. C语言连接MYSQL存取数据的一个例子
  6. 梯度下降 最小二乘法 matlab,最小二乘法和梯度下降法的理解
  7. 2018先知白帽大会 | 议题解读
  8. java coherence_Coherence配置默认覆盖路径
  9. Python super钻石继承
  10. python set集合转numpy.array
  11. erstudio怎么导入mysql数据库?_使用ERStudio生成数据库设计文档。
  12. python贺卡编程_一种卡片编程机及其编程方法与流程
  13. 非主流闪图头像教程:动感头像效果
  14. 思科认证入门级课程介绍(二)
  15. BUG处理:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path buil
  16. 互联网的996与华为的惊世骇俗
  17. 3d虚拟VR实训教学软件制作
  18. pandas行/列删除
  19. idea创建文件时生成文档注释
  20. qq密码自动测试软件,QQ2004测试版密码获取演示

热门文章

  1. 11月26日科技资讯|京东负责不幸员工的孩子费用到22岁;Linux kernel 5.4发布
  2. 代驾小程序开发功能模块介绍
  3. 毕设-基于SSM物业管理系统
  4. 你是从桃花岛来的吗 我是从绝情谷来的
  5. php期末作品,php 论坛 期末作业
  6. MVC三层架构Servlet
  7. Halcon 区域变换(打散connection、填充fill_up、形状变换shape_trans、凸性 convex、骨架skeleton)
  8. php开源 云盘,开源云盘利器:Nextcloud 21私有云盘搭建
  9. apple与android传数据线,无论苹果还是安卓,出门带一根x-connect数据线就够了
  10. 3.1 计算机视觉的发展和卷积神经网络概要(百度架构师手把手带你零基础实践深度学习原版笔记系列)