数据结构
1.1 基本概念
在计算机中,数据结构就是指 计算机中描述和存储数据的方式,主要是描述数据元素之间的逻辑关系以及在计算机的存储形式。
通常情况下,数据结构的选择会影响到程序的运行效率(时间复杂度)以及程序的存储效率(空间复杂度)。
计算机程序 = 数据结构 + 算法
1.2 基本分类/层次结构
(1)逻辑结构 - 抽象层
主要描述数据元素之间的逻辑关系。
(2)物理结构 - 结构层
主要描述数据元素之间的位置关系,在计算机中的存储形式。
(3)运算就诶够 - 实现层
主要描述如何实现该结构以及该结构的基本操作。
1.3 逻辑结构的分类
(1) 集合落结构
主要描述所有的数据元素都属于一个总体,不强调元素之间的关系。
如:
23 5 7 10 ... 统称位质数/素数
(2) 线性结构
主要描述所有的数据元素之间存在一对一的关系的前后关系,除了第一个元素外,每个元素都有一个前趋元素,除了最后一个元素外,每个元素都有一个后继元素。
如:
公交站牌的排队 手链
(3)树形结构
主要描述元素之间存在一对多的关系,其中起始元素称为根元素,末尾/顶端的元素称为叶元素,除了根元素之外,每个元素都有且只有一个前趋元素,除了叶元素之外,每个元素都可以有多个后继元素。
如:
树 家谱
(4)网状结构
主要描述数据元素之间存在多对多的一个交叉关系,也叫做图形结构,每个元素都可以有多个前趋元素和多个后继元素。
如:
网球拍 蜘蛛网
1.4 物理结构的分类
(1)顺序存储结构
顺序存储结构就是指使用一组连续的存储单元依次存储逻辑上相邻的多个元素。如果每个元素的数据类型相同,则存储每一个数据元素的存储空间也相同。
如使用C语言中的数组来加以描述。
优点:
1)节省存储空间,因为不需要申请额外的存储空间来表达数据元素之间的逻辑关系,只需要存储数据本身的空间即可。
2)支持下标访问,实现随机访问。
缺点:
1)申请存储空间需要指定明确的大小,可能不够也可能浪费存储空间。
2)顺序存储结构要求必须是连续的内存存储空间,所以存储空间的利用率比较 低。
3)在顺序存储结构中插入/删除元素时,可能需要移动大量的元素。
(2)链式存储结构
链式存储结构就是指使用一组不连续的存储单元依次存储各个元素,也就是说不要求逻辑上相邻的元素在物理位置上也相邻。
链式存储结构中将每个元素存放在彼此独立的存储单元中,该存储单元称为节点,但是为了让这些节点之间有联系,则需要在每一个节点中增加一个指针,该指针用于记录下一个节点的地址,于是所有的节点就被连接起来了。
绝大多数编程语言(如:C语言)中并没有提供对应的数据类型来描述链式存储结构,一般都需要手动编码实现。
优点:
1)申请存储空间时不需要一次性指定大小,可以随时使用随时申请。
2)不需要申请连续的存储空间,也就是说存储空间的利用率比较高。
3)插入/删除元素比较方便,不需要移动大量的元素。
缺点:
1)虽然克服顺序存储结构预知元素个数的缺点,但是每一个节点中需要增加指针变量来记录下一个节点的地址,因此总体存储空间的开销会比较大。
2)不支持下标访问,也不能实现随机访问。
1.5 逻辑结构和物理结构的关系
每种逻辑结构采用何种物理结构来实现并没有明确的规定,甚至某些特殊情况下,同一种逻辑结构可能需要多种物理结构配合来实现。
1.6 运算结构
(1)创建与 销毁
分配资源实现创建 => 建立数据结构 => 销毁占用资源。
(2)插入和 删除
向数据结构中增加元素 和 从数据结构中减少元素。
(3)修改和 查找 以及排序
修改元素的值 使用查找算法 和 排序算法。