学习数据结构更有利于了解程序的背后实现,下面我就重点详解常见的6大数据结构@mikechen
常见的数据结构有哪些?
数据结构主要包含如下6类:
数组
数组是一种最常见的数据结构,用来存储同一类型的集合。
每个数组元素可以通过一个下标来访问它们,具体如下图所示:
数组的特点:
1)在内存中申请一块连续的空间;
2) 数组下标从 0 开始;
3) 数组的类型只能是一个,且固定,在申明时确定;
4) 数组按照索引查询元素,速度很快,时间复杂度为O(1);
5)添加、删除元素的操作很耗时间,因为要移动其他元素,时间复杂度为O(n)。
链表
链表是一种由节点(Node)组成的线性数据集合,每个节点通过指针指向下一个节点,它是一种由节点组成,并能用于表示序列的数据结构。
链表结是由许多节点构成的,每个节点都包含两部分,如下图所示:
1)数据部分:保存该节点的实际数据;
2)地址部分:保存的是上一个或下一个节点的地址。
链表具有如下特点:
- 虽然时线性表,结点之间也是有顺序的,但是根据位置访问元素时间复杂度很高;
- 链表不需要连续内存,整体来讲对内存比较友好;
- 根据某个结点可以直接访问到其后继结点,或前继结点(双向链表);
- 链表是由多个结点构成,但一般只存储头结点或者头尾结点,元素不支持随机访问,只能顺序遍历访问;
- 通常来讲链表的插入和删除比数组高效(但也得分情况)。
链表的分类如下:
1.单链表:每个节点仅指向下一个节点,最后一个节点指向空(null)。
具体如下图所示:
2.双链表:每个节点有两个指针p,n。p指向前一个节点,n指向下一个节点;最后一个节点指向空。
具体如下图所示:
3.循环链表:每个节点指向下一个节点,最后一个节点指向第一个节点。
具体如下图所示:
栈
栈:栈是一种计算机系统中的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。
如下图所示:
栈是一个元素集合,支持两个基本操作:push用于将元素压入栈,pop用于删除栈顶元素。
栈的操作常用的有:进栈(PUSH),出栈(POP)。
1.进栈(PUSH)
PUSH:将目标内存推入栈顶。
2.出栈(POP)
POP:从栈顶中移除目标。
哈希表
哈希表,英文名为:Hash表,也称散列表,是根据键值而直接进行访问的数据结构。
哈希表它通过把键值(key-value)映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。
大家最熟悉经典的HashMap就是采用哈希表的结构:
队列
队列是一种操作受限的线性表,只允许在表的前端(front)进行删除操作又称作出队,在表的后端进行插入操作,称为入队,符合先进先出(First in First out)的特性,在队尾插入元素叫做入队,对头删除元素叫做出队。
如下图所示:
队列是一个元素集合,支持两种基本操作:用于添加一个元素到队列,用于删除队列中的一个元素,是先进先出的数据结构。
具体分类如下图所示:
二叉树
二叉树是一个树形数据结构,每个节点最多可以有两个子节点,称为左子节点和右子节点。
二叉树特征:
- 一棵树至少会有一个节点(根节点);
- 树由节点组成,每个节点的数据结构是这样的:一个数据、两个指针(如果有节点就指向节点、没有节点就指向null);
- 二叉树中,第 i 层最多有 2^( i-1)个结点;
- 如果二叉树的深度为 K,那么此二叉树最多有 2^K-1 个结点;
二叉树大致分为以下几类:
1.满二叉树(Full Tree):二叉树中的每个节点有 0 或者 2 个子节点。
2.完全二叉树:二叉树中除最后一层外其他各层的节点数均达到最大值,最后一层的节点都连续集中在最左边。
完全二叉树与满二叉树的区别
完全二叉树除最后一层,其它层都是满结点的,这就是完全二叉树与满二叉树的区别所在。
满二叉树最后一层都是满节点的,而完全二叉树不是。
3.二叉查找树:二叉查找树(BST)是一种二叉树。其任何节点的值都大于等于左子树中的值,小于等于右子树中的值。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》