数据结构学习笔记一
概述
这篇文章是我学习数据结构知识的笔记总结,示例以 java 8 语言实现。
定义
数据结构(data structure) 是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构往往同高效的检索算法和索引技术有关,因此精心选择的数据接口可以带来更高的运行或存储效率。–来着百度百科。
相关概念
数据
描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入改计算机处理的符号集合。 --来自《大话数据结构》
数据是研究数据结构的基础,将数据按一定方式进行组织就形成了数据结构。在 java 中的数据类型有整形、浮点型、字符串等,广义上来说还包括图片、声音、视频等。
数据元素
组成数据的、具有一定意义的基本单位,在计算机中通常作为整体处理。就是一条数据记录。
数据项
数据项是数据不可分割的最小单位,一个数据元素可以由多个数据项组成。如人有眼、耳、口、鼻这些数据项。
逻辑结构与物理结构
逻辑结构
分类依据是数据对象中数据元素之间的相互关系。
- 集合结构:数据元素属于同一个集合,除此之外没有其他关系。类似于数学中的集合。如班级中的学生就是一个几个。
- 线性结构:数据元素之间是一对一的关系。如链条一环扣一环。
- 树形结构:元素之间存在一对多的层次关系。如族谱、管理层结构。
- 图形结构:元素之间存在多对多的关系。如人脉关系网、铁路交通图。
物理结构
分类依据是数据的逻辑结构在计算机中的存储形式
- 顺序存储结构:计算机开辟整块内存空间来顺序存储数据,如数组。优点是可以随机访问,缺点是容量固定不能扩展,添加、删除元素效率低。
- 链式存储结构:存储空间可以不连续,每个数据元素中包含了下一个元素的地址信息,如链表。优点是添加、删除元素效率高,且容量不限制,缺点是不支持随机访问。
一些常见的数据结构
-
线性结构: 数组、栈、队列、链表、哈希表
-
树结构: 二叉树、二分查找树、AVL、红黑树、Treap、Splay、堆、Trie、线段树、K-D树、并查集、哈夫曼树
-
图结构: 邻接矩阵、邻接表
时间复杂度和空间复杂度
没有最好的数据结构,只有最适合的数据结构,通常情况下,数据结构与算法是息息相关的,数据结构在很大程度上决定了算法的实现方式。
时间复杂度
时间复杂度用来定性描述算法的运行时间,考察的是输入值大小趋近于无穷时的情况(称为渐进),用大 O 符号表述。
推导方法:
- 用常数 1 取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不为1,则去除与这个项相乘的常数。
– 来自《大话数据结构》
常见的时间复杂度:
空间复杂度
空间复杂度用来度量一个算法运行过程中临时占用的存储空间大小,也是渐进考察的,是考虑输入值大小趋近于无穷的情况,用大 O 符号表示。
均摊时间复杂度与复杂度震荡
数组
概念:
数组(Array), 是由相同类型的元素(element)的集合所组成的结构,分配一块连续的内存来存储,利用元素的索引(index)可以计算出该元素对应的存储地址。
来自维基百科的解释。
数组最大的优点是查询快速,我们可以使用索引来访问数组中的元素,最好应用于索引有语义的情况,如用数组来存储学生成绩,数组索引为学生学号,这样要查询某个学生的成绩时就非常快速高效。
访问数组元素的时间复杂度为 O(1),添加/删除数组元素的时间复杂度为 O(n)。
在 java 中定义数组时需要指定数组的容量和类型,不能动态添加,在某些编程语言中可以动态增加,不限类型,如 javascript。