数据结构= 程序 + 算法
数据结构有什么用
- 当我们使用着java官方给你提供的容器的时候,我们用起来是非常方便的,ArrayList其实是一个无线扩充的数据LinkedList其实是一个链表。
- 现实世界中存储数据,我们要通过一些工具或者建模来进行存储。每种数据结构都有自己的优缺点。
- 而算法,在这么多的数据中如果以最快的速度实现插入,删除,查找数据问题
- 我们java语言是一种面向对象的编程语言,java就相当于自动档汽车,C语言相当于手动挡汽车,python就是无人驾驶汽车,数据结构相当于变速箱的工作原理,如果你懂变速箱的工作原理,那么不但可以开车,也可修车,还可以造车
- 数据结构内容非常多,我们接收java当中常见的数据结构:堆栈,队列,数组,链表和红黑树
常见的数据结构:
- 数据存储的常见结构:栈,队列,数组,链表,和红黑树。
栈
- 栈,stack,又称为堆栈,他是运算受限的线性表结构,它的限制是仅允许在标的一端插入和删除操作,不允许在其他任何位置进行添加,查找,删除等操作。
- 简单的说,采用结构的集合,对元素的存取有以下特点
-
先进后出(存进去的元素,要在他后面的元素依此取出后,再能取出该元素)。例如:子弹压进弹夹的动作
-
栈的入口,出口都是栈的顶端位置。
空栈:栈顶栈底相等
压栈:存储元素,元素存储到栈的顶端位置,栈中已有的元素依此向栈底移动一个位置。
弹栈:取元素,栈的顶端位置元素取出,栈中已有元素依此向栈顶方向移动一个位置。
-
队列
- 队列,queue,简称对,它同堆栈几乎一样的,也是一种受限制的线性表结构,它的限制是仅允许在标的一端进行插入,在标的另一端进行删除。
- 简单的说,采用该结构的集合,对元素的存储有以下特点:
- 先进先出(存进去的元素,要在他前面的元素依此取出后,才能取出该元素)。列如:火车过隧道,火车头先从山洞出来,车尾后出来。
- 队列的入口,出口各占一侧。
数组
- 数组,Array,是有序的元素序列,数组在内存当中开辟一段连续的空间,并再此空间内存储元素。列如:生活中的酒店当中的房间号是连续的,不间断,有50个房间,从001--050每个房间都有固定的编号,通过编号就可以快速找到酒店房间的住户。
- 简单的说,采用此结构的集合,对元素取出有以下特点:
-
查找元素块,通过索引,可以快速的访问到指定位置的元素。
-
增删元素慢。
- 指定索引位置增加元素 :需要创建一个新数组,将指定的新元素存储到指定的索引位置,再把原数组元素根据它原来的索引,赋值到新数组对应的索引位置。
- 指定索引位置删除元素:需要创建一个新数组,把原数组的元素根据索引,复制到新数组对应的索引位置,原数组中的指定索引元素复制到新数组当中。
-
链表结构
- 链表,linked list,由一系列结点node(链表当中的每一个元素称为节点)组成,节点可以在运行时动态生成。每个节点包含两个部分;存储数据元素的数据域;用来存储下一个节点的指针域。我们常说的链表结构有单向列表和双向链表
链表对元素的存取的特点
-
多个节点之间,通过地址进行连接。比如:多个人玩丢手绢,每个人右手拉住下一个人的左手,上一个人的左手拉着该人的右手,以此类推,多个人就被连接起来了。
-
查询元素比较慢:想要查找某个元素,需要通过连接的节点,依此向后查询指定的元素。
-
删除元素比较快:
增加一个元素:只需要修改连接下一个元素的地址即可。
删除一个元素:只要修改连接下一个元素即可。
链表结构的特点
- 查询慢:链表结构的地址不是连续的,每次查询元素,都必须从头开始查询。
- 增删快:链表结构中,对
红黑树
-
二叉树: binary tree ,每个节点数不超过2的数(tree)
简单的理解,就是类似于我们生活中的数的结构,只不过每个节点上最多只能有两个子节点。
顶上的节点称为根节点,两边的称为左子树,右子树 -
红黑树的约束:
- 节点可以是红色的也可以是黑色的
- 根节点是黑色的
- 叶子节点(空节点)是黑色的
- 每个红色节点的子节点都是黑色的
- 任何一个节点到其每一个叶子节点的所有路径上的黑色节点数是相同的
-
红黑树的特点:
查询速度非常快,趋*于*衡树,查找叶子元素最小和最大不能超过2倍。