数组

数组是一个线性表数据结构。它用一段连续的内存地址空间,来存储一些相同类型的数据。 从上面的定义,我们不难看出几个关键词。

线性表:顾名思义,线性表就是数据排列成一条线的数据结构。每一个线性表只有前后两个方向。队列、链表、数组、栈都是线性表结构。

连续的内存空间和相同类型的数据:正是因为有了这两个限制,才使数组有了,可以根据数组的下标随机访问的特性。但是也因为连续的内存空间的限制,导致数组在进行删除和插入操作的时候,非常的低效。

如何进行数组的随机访问?

首先我们定义一个数组是,例如: int[]a=newint[10],当我们定义的时候,计算机会给数组a[]分配一块连续的内存地址。当我通过数组下标去访问时,计算机会通过寻址公式 a[i]_address=base_address+i*data_type_size计算出数据在内存中的地址,进行访问。其中,baseaddress是内存首地址,datatypesize表示数组每个元素的大小。比如:啊a[]是int类型,所以datatype_size,就是4个字节。

数组的插入和删除

为了保证数组的连续内存空间性,在对中间的元素进行插入和删除的时候,需要将数组中其他元素移动位置。这样的做法会浪费一些性能,与链表的插入和删除相比,十分低效。

在一个有序的数组中,往下标为3的位置插入元素,需要将下标4到末尾的数据整体向后挪移。如果在一个无序的数组中,往下标为3的位置插入元素,最好的办法是将下标为3的元素放到数组的末尾,再将元素插入,减少元素挪到带来的性能损耗。

和插入类似,删除数组中的一个元素,为了保证内存空间的连续性,需要进行数据的挪移。我们也可以记录下每次删除的元素,但不真正的去删除挪移元素,到数组已经满了以后,再进行一次进行数据的删除挪移。这样可以大大减少元素搬移带来的性能消耗。有点像垃圾回收机制。

数组和容器

在JAVA中提供了数组的类型的容器,比如:ArrayList。那么数组和ArrayList有哪些优缺点呢?

ArrayList最大的优点是将数组的插入、删除和查询等一些操作进行了封装,在使用的时候不需要考虑元素的搬移。另一个比较大的优点是,ArrayList支持动态扩容。由于在数组在定义的时候,计算机需要根据数组的大小分配一块连续的内存空间,所以需要提前定义数组的大小。ArrayList在底层进行了自动扩容实现,当元素大于ArrayList大小时,它会将空间扩大到1.5倍大小,然后将数据复制到新的数组。

链表

链表是一种物理存储单元上非连续、非顺序的存储结构,不需要一块连续的内存空间,他通过链表的指针有次序的将零散的内存空间连接。最常见的链表结构有:单链表、双向链表和循环链表。

单链表

单链表顾名思义,它的链表方向是单向的,对于链表的访问只能从头部开始,这也导致了链表的查询效率低下。

上图是一个单向链表,它有两个结点比较特殊,一个是第一个结点,叫头结点,用来记录链表的基结点;另一个是最后一个结点,叫尾结点,它比较特殊,并不是指向下一个结点,而是指向一个NULL地址。

插入和删除

从上面数组我们知道,由于内存空间连续的限制,元素删除和插入需要数据搬移。但是链表的内存空间不需要连续,所以它的插入和删除操作十分的高效。

对于链表的查询,我们只需要相邻结点的指针变化。

上图是一个单向链表的删除过程,从图上我们可以知道,将链表中的元素删除,将这个元素删除,然后,在将前结点的Next指针,指向它的后结点就OK了,十分的高效。插入操作也是类似,将前结点的Next指针指向,插入的元素,将插入的指针,指向它。

循环链表

循环链表是一种特殊的单链表。它与单链表的唯一区别是,尾结点的Next指针不是指向一个Null地址,而是,指向了链表的头结点,形成了一个闭环,达到了循环的目的。其实确切的说这是一种单向循环链表。

双向链表

与上面的单链表不同,双向链表元素之间是双向的,表现形式也比单链表复杂一点。它的每一个结点不止有后继指针Next,还有一个前驱指针Pre。从这一点可知,一个双向链表的结点比单向链表多一个前驱指针,这也意味着它的每一个结点需要更多的空间去存储前驱指针。

插入和删除操作与单向链表类似,只需要处理好前驱指针和后继指针的指向。

单链表和双向链表对比

我们知道,单向链表想要删除一个元素,需要从头部开始查询直到找到该元素,然后进行删除,指针从新指向,在这一点上双向链表和单向链表是一致的。但是我们如果想要删除一个元素的前驱结点,单向链表因为没有前驱指针,需要再从头遍历,消耗时间,双向链表就可以直接找到前驱结点,并删除。

其实这是一种空间换时间的思路。使用了双向链表占用了多的空间,节约了时间。这种在我们内存足够的情况下,优化算法的执行时间有很好的的帮助。

数组与链表的对比

由于内存空间连续性的不同,链表适合插入、删除操作,而数组则更加适合根据下标的查询。

本文是数据结构和算法学习的开篇文章,希望大家可以和我一起学习成长,早日找到自己想要的生活。

我是方褚,一个努力成长的程序员。

c++使用单向链表存储一组有序数据_《一起学习java和数据结构》系列-数组和链表...相关推荐

  1. c++使用单向链表存储一组有序数据_数据结构笔试题基础

    第一章 数据结构与算法 一.算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法. 1.算法的基本特征:可行性,确定性,有穷性,拥有足够的情报. 2.算法的基本要素:算法中对 ...

  2. c++使用单向链表存储一组有序数据_初试攻略丨计算机考研中数据结构知识点总结,硬核!...

    点击蓝字的小伙伴奖励酥鸡哦 苏世计算机考研,程序猿专属的学习分享社区 [声明:本文为原创文章,未经同意,严禁转载和抄袭,违者将追究其法律责任] 正文字2607,预计阅读7分钟 / 写在前面的话 / 初 ...

  3. 在java的实现栈的插入数据_栈之Java实现数据结构

    一.什么是栈? 栈(stack)又叫先进后出表,它是一种运算受限的线性表.它只允许在表的一端进行插入和删除操作,我们称之为栈顶,相对另一端称为栈底. 我们可以通俗一点,将栈比喻为一个垃圾桶,垃圾桶底就 ...

  4. java中怎样存储遍历的数据_【数据算法】Java实现二叉树存储以及遍历

    二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过Linke ...

  5. 25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势

    存储虚拟化是一种对物理存储资源进行抽象的技术,使其看起来像是一个集中的资源.虚拟化掩盖了管理内存.网络.服务器和存储中资源的复杂性. 存储虚拟化运行在多个存储设备上,使它们看起来就像一个单一的存储池. ...

  6. 6-2-二叉树(二叉链表存储)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第6章  树和二叉树 - 二叉树(二叉链表存储) --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴 ...

  7. 数据结构之数组、链表、栈和队列

    1.数组 1.1:概念 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据.这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型:数组具有连续的内存空 ...

  8. 数据结构:数组和链表的区别以及各自的优缺点

    原文地址 http://blog.csdn.net/qq_25806863/article/details/70607204 数组和链表是两种基本的数据结构,他们在内存存储上的表现不一样,所以也有各自 ...

  9. 【数据结构系列】单链表

    专栏介绍 最近也一直在思考该写点什么文章,想了很久,还是决定重新编写一下数据结构的相关内容,关于数据结构的重要性就不用我多说了,之前的文章中我也写过,但实现语言是Java.其实对于数据结构的学习,最好 ...

最新文章

  1. 鸿蒙系统tee内核,厉害!鸿蒙内核的技术定位,是赶第三代微内核的潮流
  2. 【linux】Linux kernel uapi header file(用户态头文件)
  3. mysql顺序结构_MySQL学习之流程结构
  4. 轻松进行iPad Safari设置
  5. oracle修改表结构精度,常见问题--oracle10g修改表结构
  6. scoped原理、不足、弥补或替代
  7. 爬取某东600多本书籍,用数据帮你分析哪些Python书籍值得选择(上)
  8. 插入ASP代码让网站数据库成为ASP木马
  9. transferto 文件不存在_文件上传时,MultipartFile.transferTo() 方法报 FileNotFoundException...
  10. 如何在 C# 中使用 Dapper ORM
  11. 每天一杯C_Visual Studio各个版本的区别和总结
  12. 程序员们怎么过端午?你属于哪一款?
  13. 【工业串口和网络软件通讯平台(SuperIO)教程】二.架构和组成部分
  14. ios 格式化html字符串,ios – 粘贴格式化文本,不是图像或HTML
  15. java基础技巧_java基础中的技巧
  16. 51单片机DHT11温湿度传感器
  17. 一个优秀的UI设计师必备的能力,你都有吗?
  18. JQ设置cookie(3分钟搞定)
  19. 工作照制作微信小程序V2.4.21源码
  20. 面试:HTTP Host 头攻击,是什么?

热门文章

  1. HDU1166 (线段树/修改点,询问区间)
  2. Sql server2005中如何格式化时间日期
  3. android设置屏幕高度和宽度设置,Android手机的屏幕宽高度和代码设置控件的宽高度...
  4. java点击图片发出声音_[Java教程]点击放大图片
  5. redis内存淘汰和持久化_REDIS的淘汰机制与持久化
  6. 网络摄像头转usb接口_Arduino + USB Host Sheild 实现USB鼠标转PS/2接口
  7. php post请求后端拿不到值_PHP解决Vue发起POST请求,接收不到数据
  8. python ddos 检测系统_python 检查是否存在ddos攻击
  9. docker 镜像修改的配置文件自动还原_所以到底该如何修改 docker 容器的端口映射!!!...
  10. UI设计灵感|有声读物APP界面设计