什么是数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
公式:数据结构=数据+结构
Java临时存储数据的方式:数组+对象
集合类分类
1.Collection
2.Map
集合类的存在意义:
通常,我们需要对一组对象进行操作,而事先却不知道总共有多少个对象。为解决这一问题,JAVA中的集合类应运而生。
集合类的特点
1)只能存储引用数据类型
2)可以自动地调整自己的大小
数组和集合类都是容器 它们有何不同
1)数组可以存储基本数据类型的数据,及和不可以
2)数组的长度是固定的,集合可以自动调整自己的大小
3)数组的效率高,相对而言集合的效率比较低
4)数组没有API 集合有丰富的API
栈的本质
栈的本质就是成员变量和成员方法从栈顶落入栈底的过程吧,而执行栈方法时,总是先执行栈顶的方法。
四种数据结构的类型都是抽象出来的
集合
线性结构
树形结构
图结构
因此,我们得关注数据结构在计算机底层是如何表示的?
数据结构在计算机中的表示,称为数据的物理结构,又称为存储结构或者映像。 结构的表示可以分为两种:顺序存储结构 (顺序映像) 和 链式存储结构 (非顺序映像)。
顺序映像:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。(数组)
非顺序映像:借助指示元素存储地址的”指针”,来表示数据元素的逻辑关系。(链表)
关于集合类
集合的本质是:数组、链表或者 数组+链表
对使用集合的使用者而言,集合是一种数据容器
关于数组扩容
为什么数组的存取比链表快呢
CPU处理数组或链表中的数据时,都是需要先把数组或链表从内存中拷贝到charch上,charch有三级,越靠近CPU的那级容量越小,对数组而言,可以将整个数组放在charch的每一级上,而链表可能出现一部分在一级charch上而另一部分却在二级charch处的情况,于是乎,链表的存取给CPU带来了更多的消耗,这时操作系统的换页机制和局部性原理决定的。
链表: 链表是非连续存储, 如果查找一个元素需要一步一步遍历
数组: 是连续存储, 可以根据下标一步计算出存储位置
数组
因为是连续存储,所以可以实现随机访问
数组的基本操作:增 删 查
添加 (保证元素的顺序)
最好情况:O(1)
最坏情况:移动n个元素,O(n)
平均情况:移动 n/2 个元素,O(n)
删除 (保证元素的顺序)
最好情况:O(1)
最坏情况:移动n-1个元素,O(n)
平均情况:移动(n-1)/2个元素,O(n)
查找
a. 根据索引查找元素:O(1)
b. 查找数组中与特定值相等的元素
①大小无序:O(n)
②大小有序:O(log2n)
链表
一个对象持有另一个对象的引用, 另一个对象持有之后的一个对象的引用,…… 构成一个链表
链表的本质:对象的相互持有和引用
链表的基本操作:
增 删 查
链表的分类
单链表: 在链表中的每一个节点, 都有一个子结点, (尾结点没有子结点)
循环单链表: 单链表的改进, 让单链表的尾结点的下一个结点, 指向头结点
双向链表: 双向链表也是单链表的改进, 让结点不仅可以指向之后的元素, 也可以指向之前的元素
双向循环链表: 双向链表的一个改进, 头元素的之前指向尾元素, 尾元素的之后指向头元素
单链操作
单链表:
增加(在某个结点后面添加)
删除(在某个结点后面删除)
查找
a. 根据索引查找元素
b. 查找链表中与特定值相等的元素
①元素大小有序
②元素大小无序
单链表操作:
查找o(n), 添加和删除o(1)
双向链表的操作
很容易验证,前面那些操作,双向链表和单链表的时间复杂度是一样的。那为什么在工程上,我们用的一般是双向链表而不是单链表呢
双向链表操作:
查找o(n), 添加和删除o(1)
但是在实际操作过程中, 双向链表根据下标查找的效率, 是高于单链表.
隐性的结论, 在实际工作中, 根据下标查找这个操作相对添加和删除比较频繁
思想: 用空间换时间
求链表的中间元素 判断链表中是否有环(circle)