线性表

定义

线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列。

存储结构

顺序存储

  • 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续的存储空间中,用顺序存储方法存储的线性表称为顺序表(sequential list)。因为存储的类型相同因此每个元素所占的存储空间也相同。
  • 因为顺序表存储的每个元素占用的存储空间相同,因此只要知道第一个元素的存储地址,就可以直接计算出任意元素的存储地址,所以顺序表是一种随机存储结构
  • 优点:不需要为表示元素之间的逻辑关系而增加额外的存储空间;可以方便地随机访问任意位置的元素O(n)。
  • 缺点:插入和删除操作需要移动大量的数据元素,因此效率比较低;难以选择合适的存储容量,顺序表要求连续的存储空间,在分配时会选择大小比较符合的空间,因此容易产生内存碎片。

链式存储

  • 采用动态存储分配的方式,在程序运行时根据实际需要随时申请内存,在不需要时将内存释放,这种链式方式存储的线性表称为链表(linked list)
  • 链表在实现时可以分为动态链表和静态链表,从链接方式上又可以分为单链表、双链表和循环链表等。
单链表
  • 链表用一组任意的存储单元存放线性表中的各个元素,这组存储单元可以师连续的,也可以不连续,甚至零散地分布在内存的某些位置。为了正确表示结点间的逻辑关系,在存储元素值的同时,还需要存储该元素的直接后继元素的位置信息(指针pointer)如【data,next】,因为这种结构的每个结点只包含一个链域(next),故将这种链表称为单链表(single linked list),结尾为NULL指针。
  • 查找算法
    1. 按位查找 由于链表采用的是一直顺序存取方式,如果要实现随机存取则只能从链表的表头出发,顺着每个结点的指针域往后依次访问每个结点。
    2. 按值查找 按值查找是指在单链表中查找给定值的结点,找到后返回元素地址或序号。
循环链表
  • 定义:如果将单链表终点的指针域指向头结点,则整个链表构成一个环,这种首尾相接的单链表称为单循环链表。
双向链表
  • 存储结构: 【 *prev,data, *next】,优点是可以很方便地得到直接前驱元素,这种链表中有两条相反的链域,因此称为双向链表,简称双链表
静态链表

对于使用c++指针来存储结点,结点空间的分配和回收都是由操作符new和delete动态执行的,因此称之为动态链表(dynamic linked list)。对于某些高级语言如java,没有提供指针数据类型,因此多采用数组来描述单链表,用数组元素的下标来模拟链表的指针,这种数组存储的链表结构,称为静态链表。

顺序表与链表的比较

- 时间性能比较
1. 顺序表是由数组实现的,因此是一种随机存储结构,对于表中任意结点存取操作的时间复杂度为O(1),而查找需要从头指针开始顺着链表扫描,平均负责度为O(n),因此如果线性表的主要操作是查找而很少插入或删除操作,则采用顺序表比较合适。
2. 对于链表,在某个位置上进行插入和删除操作,只需要修改指针即可,无需移动大量元素,操作复杂度为O(1)。若插入和删除主要发生在表头和表尾,则采用循环链表更为方便。
- 空间性能比较
1. 顺序表上的存储空间是静态分配的,因此必须提前确定其存储大小,故顺序表常常用于存储规模比较容易确定的线性表。
2. 静态链表也是静态分表的,所以会有相同的问题。但是如果同时存在多个结点类型相同链表,则这些链表可以共享同一静态链表空间。
3. 动态链表的存储空间是动态分配的,因此只要内存空间还有空闲就不会溢出。因此适用于那种长度变化较大或者长度难以估计的线性表。

STL中相关的模板类

- STL中的向量(Vector)是使用数组实现的,因此具有顺序表的所有特点,可以快速存取任意元素,向量是同一种数据类型的对象集合。
- 列表(list)是STL中线性表的链式存储形式,STL标准库中一般采用双向循环链表实现列表。因此list容器不支持"直接"随机访问(可以通过内部实现“随机”,但是效率不如数组),查找某个元素时往往需要遍历相邻的若干元素。其优点是任何位置都可以高效地插入或删除元素,并且不需要移动其他元素。

《数据结构与STL-第二章 线性表》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. 框架----Django框架(基础篇)

    一.基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: pyt ...

  2. Linux之执行命令操作20170330

    介绍一下Linux系统中的代码执行shell等命令的几种操作方式: 一.标准流管道popen 该函数的原型是FILE * popen(const char* command, const char * ...

  3. ubuntu 16 server 安装lnmp所需依赖

    安装 1.nginx build-essential libc6 libpcre3 libpcre3-dev libssl-dev zliblg zliblg-dev lab-base 依赖库: ap ...

  4. linux shell 通配符

    http://note.youdao.com/noteshare?id=4b6bc019e055c897c6dfb81fe2c17756

  5. 怎么查看ubuntu是32bit还是64bit的?

    怎么查看ubuntu是32bit还是64bit的?你用uname -a的时候看到的i686就是32bit的----

  6. 使用rabbitmq消息队列

    一.前言 在python中本身就是存在队列queue.一个是线程队列queue,另一个是进程multiprocessing中的队列Queue. 线程queue:只用于线程之间的数据交互 进程Queue ...

  7. I/O多路复用和异步I/O

    一.I/O模式 对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间.所以说,当一个read操作发生时,它会经历两个阶段: ...

  8. 「Python」socket指南

    开始 网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式.网络可以是逻辑的.本地的电脑网络,或者是可以物理连接到外网的网络,并且可以 ...

  9. 下载外部jar包后,链接源码和javadoc.jar

    今天下载了一个Apache Common的一个jar包,对于引入源码和JavaDoc有了新的认识,在这里记录一下. Binaries是指二进制文件,包含使用的jar包.Source是指源码. xxx. ...

  10. angularjs结合plupload实现文件上传

    转载注明:(罗志强的博客) angularjs的指令directive非常好使,可以很方便的结合各种插件,实现很强大的功能. 今天用到了plupload,就拿它举例吧. 正常的plupload用法应该 ...