前言:
这是第一次在CSDN上写文章。作为自己的一个复习以及自己的一个记事本。以后每天会把自己学习以及用到的东西给写出来。今天回顾一下数据结构。数据结构可以说是每个程序员的基础。所以这个我们需要熟练的知道数据结构有哪些以及它的优缺点,以及适用的场景。
八大基本数据结构:
1.数组
2.链表
3.栈
4.队列
5.堆
6.树
7.图
8.散列表
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
线性非线性。
以上这八个数据结构又分为两类,一类为线性结构,一类为非线性结构。
线性结构:一对一的关系。即除了第一个和最后一个数据元素外,其它元素都是首尾相接没有例外。
非线性结构:一对多或者多对一的关系等。
线性结构有:数组,链表,队列,栈。
非线性结构有:堆,树,图,散列表。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
一 、数组
数据是可以在内存中存储多个元素的结构,在内存中的分配也是连续的,数组的访问时通过下标,下标开始为0.
优点:
1.按照下标查找元素,查找的速度快。
2.按照索引便利数组方便。
缺点:
1.数组的大小确定后无法改变。
2.数据中心只能储存一种类型的数据。
3.添加,删除的操作慢。因为其要移动元素,而且进行添加或者删除数组中某一地点的元素的时候,需要遍历数组,动态的去修改数组的下表对其进行赋值。
适用场景:
频繁查询,对存储空间的要求不大,很少增加或者删除的情况。
二、链表
链表分为三种,单向链表,双向链表,循环链表。
单向链表:单项链表有一个head,单向链表的每一个数据都分为两个部分,前一部分为数据域,存储数据,后一部分为指针域存储下一个数据的地址。
循环链表:基本与单向链表的样式一样,唯一不同的地方就是,单项链表的尾部节点的指针域存储的是NULL,而循环链表存储的是head节点的地址。这样的话就形成了一个环形,循环列表。
双向链表:双向链表与以上的两个链表都不相同,它每个数据里有三个空间,一个空间存储上一个空间的地址,一个存储数据,一个存储下一个数据的地址。它相对于单向链表的好处是可以从任何一个地方进行查询。单向列表更加的方便。
链表的添加节点的操作票的时间复杂度为O(1);
优点:
1.从链表的添加删除操作就可以看出,链表添加删除元素时候非常的方便。只需要改变前后两个指针域指向的地址就可以了。
2.链表是很常用的数据结构,不需要初始化容量,动态的存储,可以任意的添加删除元素。
缺点:
1.因为链表中含有大量的指针,所以占用的空间非常的大。
2.遍历时需要遍历链表查找,非常的耗时间。
与数组相比增加删除元素非常的简单但是在遍历查询的时候非常的耗时。
适用场景:
数据量小,需要频繁的增加删除操作的场景。
三、栈
栈是一种线性结构,能够以数组或者链表作为底层结构。
特点:
1.遵守“先进后出“的原则,简称FILO结构。
2.限定只能在栈顶进行添加和删除操作。
相关概念:
1.栈顶与栈底:允许元素插入与删除的一端为栈顶,另一端为栈底。
2.压栈:栈的插入操作,也叫进栈,入栈。在压栈的过程中。栈顶的位置一直向上移动,而栈底是一直不变的。
3.栈的删除操作,也叫做出栈,删除最后一个进栈的元素。
适用场景:
栈的结构就像是一个集装箱,越先放进去的东西越晚才能够拿出来,所以栈常用与实现递归功能方面的场景。
四、队列
队列与栈一样,也是一种线性表,不同的地方时,队列可以再一端添加元素,在另一端删除元素。也就是先进先出,从一端放入元素的操作叫做入队,去除元素为出队。
适用场景:
因为队列先进先出的原理,一般用作多线程阻塞队列的管理中心非常的适用。
五、树
树是一种数据结构。它是n(n>=0)个节点的有限集。n=0时被称为空树。n>0时,有限的元素构成一个具有层次感的数据结构。
特点:
1.树是一对多的关系。
2.n>0时,根节点是唯一的,不可能存在多个根节点。
3.每个节点有零个至多个子节点,除了根节点外,每个节点有且仅有一个父节点。根节点没有父节点。
相关概念:
1.子树:除了根节点外,每个子节点都可以分为多个不相交的子树。
2.孩子与双亲:若一个结点有子树,那么该结点称为子树根的“双亲”,子树的根是该结点的“孩子”。
3.兄弟:具有相同“双亲”的子节点互为“兄弟”。
4.节点的度:一个节点拥有子树的数目。
5.叶子:没有子树,也即是度为0的节点。
6.分枝节点:除了叶子节点之外的节点,也即是度不为0的节点。
7.内部节点:除了根节点之外的分支节点。
8.层次:根节点为第一层,,其余节点的层次等于其双亲节点的层次加一。
9.树的高度:也称为树的深度,树中节点的最大层次。
10.有叙树:树中节点各子树之间的次序是重要的,u 可以随意交换位置。
11.无序树:树中节点各子树之间的次序是不重要的。可以随意交换位置。
12.森林:0或多棵互不相交的树的集合。
二叉树:
定义:
二叉树或者为空集,或者由一个根节点和两棵互不相交的、分别称为左子树和右子树的二叉树组成。
1.二叉树是有序树,区分左子树与右子树,不可以随意交换子树位置。
2.一个节点的子树数量取值范围为0,1,2.
满二叉树:
1.所有的节点都同时具有左子树和右子树。
2.所有的叶子节点都在同一层上。
在同样深度的二叉树中,满二叉树的节点数目是最多的,叶子树也是最多的。
完全二叉树:
在一棵二叉树中,只有最下两层的度可以小于2,并且最下一层的叶子节点集中出现在靠左的若干位置上。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
二叉树的性质:
性质一:在二叉树的第i层上最多有2^(i-1)个节点 (i>=1)
性质二:深度为k的二叉树最多有2^k-1个节点。
性质三:对任何一棵二叉树T,如果终端节点数为n0,度为2的节点数为n2,那么n0=n2+1
性质四:具有n个节点的完全二叉树的高度为至少为log2(n+1)
性质五:如果对一棵有n个节点的完全二叉树的急诶单按层序编号(从底层开始到最下一层,每一层从左到右编号),对任一节点i有:
1.如果i=1,则节点为根节点,没有双亲。
2.如果2i>n,则节点i没有左孩子;否则其左孩子节点为2i。
3.如果2i+1>n,则节点i没有右孩子;否则其右孩子节点为21+1.
遍历二叉树:
1.前序遍历,现访问根节点,然后前序遍历左子树,再谦虚遍历右子树。
2.中序遍历,从根节点开始,中序遍历根节点的左子树,然后访问根节点,最后总会难过许遍历右子树。
3.后续遍历,从左到右先叶子后节点的方式遍历访问左子树,左右子树都访问结束,才访问根节点。
删除节点:
删除二叉排序树的某个节点有三种情况:
1.被删除节点同时有左子树和右子树
2.被删除节点只有左子树或者右子树
3.被删除节点没有子树。
六、堆
堆是一类特殊的数据结构的统称。堆通常可以被看做是一棵树。(在排序算法中有对排序,也是按照堆的特性去进行排序的)
特点:
1.堆中某个节点的值总是不大于(最大堆)或者不小于(最小堆)其父节点的值。
2.堆总是一颗完全二叉树。
运用场景:
1.实现不知道程序所需对象的数量和大小。
2.对象太大,不适合使用堆栈分配器。对使用运行期间分配给代码和堆栈意外的部分内存。
七、图(Graph)
图的存储结构相对于线性表和树来说更为复杂,因为图中的顶点具有相对概念,没有固定的位置。图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一。
八、散列表(哈希表)
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。
特点:
它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
总结:好长时间没有理这些基础的知识了,今天重新理了一下,感觉一些基础的知识才是最重要的。了解其中的用途。在合适的地方用合适的东西。就像在最合适的地点遇到对的人。上面写的东西不是特别的全。希望各位不要吐槽。