数据结构概述
但凡有数据“扎堆”的地方,就有数据结构结构的影子
但凡有数据结构的地方,脱离不了算法的折磨
数据结构与算法的作用
程序 = 数据结构 + 算法
- 数据们之间的关系,将离散的数据规整划一
- 如何将这个关系具体实现并存储在计算机中
- 基于关系之上对数据的具体操作,增删改查等
- 数据结构的具体使用场景
数据结构概述
数据之间的关系 - 逻辑结构
是指数据元素之间的相互关系,是我们想象出来的,并没有实质性的将其存储在计算机中
- 线性结构:线性结构中的数据元素之间一对一的关系
- 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
- 图形结构:图形结构的数据元素是多对多的关系
关系在计算机上的存储 - 物理结构
是指数据的逻辑结构在计算机中的具体存储形式
- 顺序存储结构:开辟一组连续的空间存储数据
通常用数组来实现,数组空间本身是连续的,保证了数据之间的关系 - 链式存储结构:开辟一组随机的空间存储数据
通常用节点来实现,节点不仅要存储数据还要存储下一个节点的位置以保证数据之间的关系
算法概述
- 是解决特定问题求解步骤的描述,分析问题,一步一步求解,并得到结构,这一系列的步骤就称为算法
算法的时间复杂度
算法时间复杂度主要探究的问题是问题输入规模N的数量级,不是算法的具体执行次数
常数阶O(1):就是那些无循环、不递归、与问题输入规模N无关、逐行执行的代码
**线性阶O(n):**与输入规模有关的,主要是一层循环的代码,多个一层代码可以并列,当不能包含
**线性阶O(n+m):**和线性阶O(n)一样,只不过有两种输入规模
平方阶:O(n^2): 与问题输入规模有关的,相互要是二层镶嵌循环代码
**平方阶:O(nm):**和平方阶O(n^2)一样,只不过有两种数据输入规模
对数阶:O(log n): 与问题输入规模有关的,只要是一次循环迭代或递归的代码
==时间复杂度简单计算:忽略常数,只保留幂高项、且忽略幂高项的系数
动态数组
静态数组与动态数组
- 静态数组:
数组是相同类型的数据按照顺序组成的一种引用数据类型
缺点: 数组的长度不可改变,可以通过下标快速访问,但增删元素不好处理。而且它只有length属性
长度不可变----扩容
创建一个新的数组,长度为需要的长度(比如:原来数组长度的两倍),将原数组的值赋给新创建的数组。之后再将新数组指向原来的数组
增删元素–线性结构要保证元素的连续性
从有效元素的最后 一个元素开始依次往后移,直到要插入的角标。最后插入元素
只有length属性 --封装
== 动态数组是顺序存储结构具体实现的核心思想==
线性表的实现
线性结构有顺序存储结构和链式存储结构实现,将两者的共同操作进行抽取,定义出线性结构的接口
ArrayLIst 是线性结构顺序存储方式的具体实现,称为线性表
**线性表的定义:**零个或多个元素的有限序列
当线性表长度为0 时表示空表
线性表的增删改查
栈的实现:
仅在表尾进行插入和删除操作的线性表
- 栈顶(top):表尾 栈底(bottom):另一端
- 空栈:不含任何数据元素
- 后进先出
- 插入叫进栈(压栈、入栈)
- 删除操作:出栈(弹栈)
栈接口的定义:
ArrayStack类
该类为栈的顺序存储具体实现
因为栈本身就是一种特殊的线性表,所有我们借用之前的ArrayList来实现ArrayStack