王道数据结构 学习笔记
第一章 绪论
1.1数据结构的基本概念
1.1.1 数据结构在学什么
人类社会的发展,迄今经历了和经历着三个浪潮:第一次浪潮为农业阶段,从约1万年前开始;第二次浪潮为工业阶段,从17世纪未开始;第三次浪潮为正在到来的信息化阶段。
数据结构在学什么?
- 如何用程序代码把现实世界的问题信息化
- 如何用计算机高效地处理这些信息从而创造价值
1.1.2数据结构的基本概念
数据
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。(二进制0和1)
数据元素、数据项
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
数据结构、数据对象
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
数据的三要素
逻辑结构、物理结构(存储结构)、数据的运算
逻辑结构:集合、线性结构、树形结构、图状结构(网状结构)
集合:烤盘中的各种食材没有相对应的关系,但都属于烤盘这一个集合。
线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
树形结构:数据元素之间是一对多的关系
图结构:数据元素之间是多对多的关系
物理结构:顺序存储、链式存储、索引存储、散列存储
顺序存储和链式存储都是线性结构
顺序存储:在计算机的物理内存里面用数据元素的存储位置相邻,来表示各个数据元素逻辑上的这种相邻的关系。要求给各个数据元素分配的是一片连续的存储空间。
链式存储:逻辑上相邻的各个元素在物理位置上可以不相邻,而是借助这个元素存储地址的指针来表示,它的下一个元素到底是在什么位置存储,各个元素之间的先后关系是用指针来表示的,不要求各个数据元素它的存放位置在物理上相邻
索引存储:会建立一张索引表,在索引表当中记录各个数据元素的这种先后次序,同时也要记录每一个元素,它实际的存放地址,采用索引存储的话就需要在内存中在消耗一些存储空间来专门的存放索引表。
散列存储:会根据数据元素的关键字直接计算出该元素的存储地址,又称为哈希存储。
数据的运算:
用数学化的语言定义了某一种数据的逻辑结构和对这种数据的运算,而只有当我们要实际的用计算机去实现这种数据结构的时候,才需要考虑到我们到底要采用那种存储结构,所以ADT并不讨论具体要采用那种存储结构,
数据对象是数据的子集,数据对象是具有相同性质的数据元素组成,而每一个数据元素中又包含一个一个的数据项。
当我们在讨论数据结构的时候,更关注的是各个元素他们之间在逻辑上存在的关系,同时还需要定义对这些数据元素应该要实现的哪些运算,
1.2算法和算法评价
1.2.1 算法的基本概念
算法的特性
算法的特质
不能将错就错
设计一个好的程序,就是要设计一个合适的好的数据结构以及高效率的算法。数据结构就是我们要处理的一些信息,而算法就是处理这些信息的一个具体的。对于我们来说,我们就是要用代码的方式来描述处理信息的步骤。
1.2.2 算法的时间复杂度
算法的时间复杂度就是算法的时间开销。
让这段代码让机器跑一下,来看他的运行时间是多少,就可以统计出一个算法的时间开销,这就是事后统计的方式。但是用这种方法来评价一个代码是存在一些问题的,程序代码的执行速度和机器性能是有关的。算法的时间开销还和实现这个算法所采用的编程语言是有关系的,越高级的语言执行效率越低。
算法的时间复杂度就是在算法运行之前就能预估出一个算法的时间开销和问题规模的关系
1.2.3 算法的空间复杂度
我们在分析一个算法的空间复杂度的时候,只需要关注,它所需要的存储空间大小和问题规模相关的这些变量就可以了,