《数据结构与STL-第二章 线性表》读书笔记
线性表
定义
线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列。
存储结构
顺序存储
- 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续的存储空间中,用顺序存储方法存储的线性表称为顺序表(sequential list)。因为存储的类型相同因此每个元素所占的存储空间也相同。
- 因为顺序表存储的每个元素占用的存储空间相同,因此只要知道第一个元素的存储地址,就可以直接计算出任意元素的存储地址,所以顺序表是一种随机存储结构。
- 优点:不需要为表示元素之间的逻辑关系而增加额外的存储空间;可以方便地随机访问任意位置的元素O(n)。
- 缺点:插入和删除操作需要移动大量的数据元素,因此效率比较低;难以选择合适的存储容量,顺序表要求连续的存储空间,在分配时会选择大小比较符合的空间,因此容易产生内存碎片。
链式存储
- 采用动态存储分配的方式,在程序运行时根据实际需要随时申请内存,在不需要时将内存释放,这种链式方式存储的线性表称为链表(linked list)
- 链表在实现时可以分为动态链表和静态链表,从链接方式上又可以分为单链表、双链表和循环链表等。
单链表
- 链表用一组任意的存储单元存放线性表中的各个元素,这组存储单元可以师连续的,也可以不连续,甚至零散地分布在内存的某些位置。为了正确表示结点间的逻辑关系,在存储元素值的同时,还需要存储该元素的直接后继元素的位置信息(指针pointer)如【data,next】,因为这种结构的每个结点只包含一个链域(next),故将这种链表称为单链表(single linked list),结尾为NULL指针。
- 查找算法
- 按位查找 由于链表采用的是一直顺序存取方式,如果要实现随机存取则只能从链表的表头出发,顺着每个结点的指针域往后依次访问每个结点。
- 按值查找 按值查找是指在单链表中查找给定值的结点,找到后返回元素地址或序号。
循环链表
- 定义:如果将单链表终点的指针域指向头结点,则整个链表构成一个环,这种首尾相接的单链表称为单循环链表。
双向链表
- 存储结构: 【 *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-第二章 线性表》读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- dorado重置按钮事件
// @Bind #btnReset.onClick!function(self, arg) { var subNo = view.get("#dsQueryCriteria"). ...
- phonegap(cordova)从手机app跳转到web页面在跳转回APP本地页面思路
项目中需要用到 WAP支付宝支付. 但是 使用PHONEGAP开发 跳转到支付宝支付,然后跳转回来 就回不到APP的本地页面, 就是使用WAP的第三方登录也是一样的.很难从WAP页面在跳转到 app本 ...
- Codeforces 543.B Destroying Roads
B. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- mysql group_concat方法用法
目前有三张表: 课程表: course,里面有student_id 学生表: student,里面有 name 字段 中间表(课程和学生一对多): course_student, 里面有 co ...
- echo 不换行
原文 http://blog.sina.com.cn/s/blog_4da051a6010184uk.html echo -n 不换行输出 $echo -n "123" $ec ...
- libxml2在mingw下编译
1.配置MingW路径,在环境变量path中加入/mingw32/bin2.解压libxml,进入win32目录3.记事本打开configure.js,找到var compiler = "m ...
- [php]apache虚拟主机配置
1.所谓虚拟主机的配置,即url与磁盘目录的绑定 2.在httpd.conf中查询Virtual host,发现有注释说明需要在conf/extra/httpd-vhosts.conf中进行配置. 3 ...
- NYOJ 1022 合纵连横 (并查集)
题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...
- php审计学习:xdcms2.0.8注入
注入点Fields: 注册页面会引用如下方法: $fields 变量是从 $fields=$_POST['fields']; 这里获取, 在代码里没有过滤. 打印 fields 数据查看: 从代码上看 ...
- PHP深浅拷贝
举个栗子: <?php class Example1 { public $name; public function __construct($name) { $this->name = ...