前言
必须要有一个正确的认知,虽然很多人在开发过程中可能没有用到算法,但是这不代表算法不重要,因为如果只会使用api,使用各种框架的话,大概率只能做一个架子工,要想深入的了解代码远离等东西,就需要去学习数据结构、算法等知识。在编程的时候,越是深入、越复杂的逻辑,我们就需要考虑时间复杂度、空间复杂度、内存是否节省等问题,写出一些高质量的代码。
数据结构与算法与语言无关,这是为了增强我们的编程思想
程序设计=数据结构+算法
数据
数据是描述客观事物的符号(数据=符号)
特征:
- 可以输入到计算机中
- 可以被计算机识别和处理
数据元素: 数据的基本单位,也称为结点或者记录,也就是一张表中的一条记录
数据对象:相同特殊性的数据元素的集合,是数据的一个子集。例如一个excel表就是数据对象
数据项:独立含义的数据的最小单位。也就是表中的某一项,如姓名、性别等
目的: 存储起来,方便后期的再次利用
既然数据的目的是存储,但是计算机中数据的存储并不是随意的,而是有一定的规则和方式,所以这就要求我们有一个合适的方式去完成存储,这也就是数据结构的核心。
如果有一个复杂的树形数据,我们可以使用数组进行存储,但是这不方便后期的再次取用
此时我们就需要思考:如何存储具有复杂关系的数据更有助于后期对数据的再利用
数据结构
概念:
数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。
也可以理解为是相互之间存在一种或多种特定关系的数据元素的集合
主要作用: 阐述数据之间的关系
结构: 简单的理解就是关系,不同的数据元素之间不是独立的,而是存在特定的关系
分类:
| 学生表 | |||
|---|---|---|---|
| 姓名 | 性别 | 身高 | 班级代码 |
| 王刚 | 男 | 180 | 123 |
| 班级表 | |||
| 班级代码 | 班级名称 | 所属系部 | |
| 123 | 计算机1班 | 计算机学院 |
逻辑结构:
数据对象中元素之间的相互关系(其实也就是班级代码和班级名称之间的关系)
分类: 四种
- 集合结构: 和数学上的集合是一样的,数据元素同属于一个集合,他们之间没有其他关系
- 线性结构: 最典型的数据关系是一对一,是一种有序数据的集合(eg:数组、栈、队列等)
特征: 除了第一个和最后一个数据元素之外,其他数据元素都是首尾相接的
遵循的是个特点:
- 必存在一个第一个元素
- 必存在最后一个元素
- 除最后一个元素外,其他的数据元素均有一个唯一的“后续”
- 除第一个元素之外,其他的数据元素均有一个唯一的“前驱”
- 树形结构: 数据元素是一对多的关系
- 图形结构: 多对多的关系
物理结构
数据元素存储到计算机中的存储器里,相对内存而言的
数据的存储应该正确的反应数据元素之间的逻辑关系
分类:
顺序存储:
数据元素存放在地址连续的存储单元里 数据间的逻辑关系和物理关系是一致的
第一个放在第一个位置 第二个放在第二个位置 等等
这个是理想状态 因为这类比于我们生活中的排队现象的话,我们在排队是可能会有人插队、离开放弃排队等现象的发生,所以排队的队伍是在随时发生着变化的,此时上述的顺序存储结构可能就显得不科学、合理了。那么我们再来看看链式存储。
链式存储:
链式存储的实质就是随意开辟空间来存储数据,同时引进指针来存放地址,通过地址找到对应的元素
顺序结构和链式结构的区别:
顺序结构的存储是有序、连续的
链式结构的存储是无序、可以不连续的,因为链式结构引进了指针的概念,指针是用来存储地址的,通过地址找到对应的元素
常见的数据结构
常见的数据结构有很多,而且每一种都有其特定的业务场景。另外,每一种数据结构都有自身擅长的特性,那么这就给开发提出了要求,如何在开发过程中选择更合适的数据结构。
算法
抽象理解: 从现实出发去理解就是解决问题的不同的方法
理解: 解决问题的方法和步骤就是算法
数据结构的实现离不开算法