程序员的进阶课-架构师之路 - 线性表
一、线性表的定义
【百度百科】线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。
1、线性表(List)是零个或多个数据元素的集合
2、线性表中的数据元素之间是有顺序的
3、线性表中的数据元素个数是有限的
4、线性表中的数据元素的类型必须相同
生活中的线性表:
数组也是一种线性表。
二、线性表的分类
1.顺序表
基本思想:元素的存储空间是连续的。在内存中是以顺序存储,内存划分的区域是连续的。存储结构如下:
2.链表
基本思想:元素的存储空间是离散的,单独的(物理),它们可以通过在逻辑上指针的联系使得它成为了整体的链表。存储上分为数据和指针两部分。存储结构如下图:
单链表和循环链表只可向一个方向遍历;双链表和循环链表,首节点和尾节点被连接在一起,可视为“无头无尾”;双链表可以向两个方向移动,灵活度更大。
三、线性表的一些常用操作
1、创建线性表
2、销毁线性表
3、清空线性表
4、将元素插入线性表
5、将元素从线性表中删除
6、获取线性表中某个位置的元素
7、获取线性表的长度
四、选择合适的数据结构
1.基于存储的考虑
顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对"MAXSIZE"要有合适的设定,过大造成浪费,过小造成溢出。可见对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密度较低(存储密度是指一个结点中数据元素所占的存储单元和整个结点所占的存储单元之比,显然链式存储结构的存储密度是小于1的)。
2.基于运算的考虑
在顺序表中按序号访问的时间性能为O(1),而链表中按序号访问的时间性能O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;而在顺序表中做插入、删除时平均移动表中一半的元素,当数据元素的信息量较大且表较长时,这一点是不应忽视的;在链表中作插入、删除,虽然也要找插入位置,但操作主要是比较操作,从这个角度考虑显然后者优于前者。
3.基于环境的考虑
顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,相对来讲前者简单些,也是用户考虑的一个因素。
扩展阅读:https://www.roncoo.com/view/1160515822987776001
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
VMWARE下复制centos8虚拟机导致IP丢失问题处理
在vmware下安装完一台centos8服务后再进行复制后出现如下问题 拷贝前的源centos与拷贝后的centos服务都没有了IP,需要重新设置 对于这个情况经反复测试需要在 centos8的/etc/sysconfig/network-scripts下增加一个eth0的配置来解决 解决顺序如下 1,cd/etc/sysconfig/network-scripts 到相应目录下,先执行 su 命令,将自己切换到 root 权限下 su root 2,su成功后执行 cp ens33 eth0 将这个目录下原有的ens33配置文件 copy一份命名为eth0 3,执行ip addr 命令先取到相应网卡的mac地址,执行结果如下 在这里复制ens33对应的ether数据 00:0c:29:52:22:d1 , 这个值在稍后编辑eth0文件时要用到 4,vi eth0文件 在里边着重修改增加反复选择的几条,原配置文件中的ONBOOT,NAME,DEVICE等参数注意注释掉(这里用的是另外一台已经处理好的虚拟机进行截图,所以显示的mac不一样。不会vi编辑的只要进入文件后打一下insert键...
- 下一篇
从源码学习Java并发的锁是怎么维护内部线程队列的
从源码学习Java并发的锁是怎么维护内部线程队列的 在上一篇文章中,凯哥对同步组件基础框架- AbstractQueuedSynchronizer(AQS)做了大概的介绍。我们知道AQS能够通过内置的FIFO队列来完成资源获取线程的排队工作。那么AQS是怎么来维护这个排队工作的呢?今天我们就来扒一扒AQS源码。从源码中来看看是怎么维护对了的。 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第一篇:《Java并发包下锁学习第三篇-从源码学习Java并发是怎么维护内部线程队列的》。 在上篇我们知道AQS内部有个内部类-Node对象。这个对象就是来维护线程对资源访问的排队工作的。具体怎么操作的呢?本文主要内容:Node节点介绍;在同步器中怎么为维护排队的流程图。 一:Node节点对象介绍 在AQS内部有个Node对象的内部类。我们来看看这个对象都有哪些属性: 简化后: static final class Node { //线程等待状态 volatile int waitStatus; //当前节点的上一个节点 volatile Node prev;...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题