常见的数据结构

数组

什么是数组

数据是有限个相同类型的变量所组成的有序集合。数组中的每一个变量被称为元素。

paste image

数组的基本操作

读取O(1)、更新O(1)、插入O(n)、删除O(n)、扩容O(n)。

链表

什么是链表

链表是一种在物理上非连续、非顺序的数据结构,由若干个节点组成。

单向链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。
paste image

链表的基本操作

读取O(n)、更新O(1)、插入O(1)、删除O(1)。

链表 VS 数组

链表:适合多读、插入删除少的场景。

数组:适用于插入删除多、读少的场景。

paste image

什么是栈

栈是一种线性逻辑数据结构,栈的元素只能后进先出。最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫栈顶。

一个比喻,栈是一个一端封闭一端的开放的中空管子,队列是两端开放的中空管子。

paste image

如何实现栈

数组实现:
paste image

链表实现:
paste image

栈的基本操作

入栈O(1)、出栈O(1)。

栈的应用

  • 回溯历史,比如方法调用栈;
  • 页面面包屑导航。

队列

什么是队列

一种线性逻辑数据结构,队列的元素只能后进后出。队列的出口端叫做队头,队列的入口端叫做队尾。

paste image

如何实现队列

数组实现:
paste image

链表实现:
paste image

队列的基本操作

入队 O(1)、出队 O(1)。

队列的应用

  • 消息队列
  • 多线程的等待队列
  • 网络爬虫的待爬URL队列

哈希表

什么是哈希表

一种逻辑数据结构,提供了键(key)和值(value)的映射关系。

paste image

哈希表的基本操作

写入 O(1)、读取 O(1)、扩容 O(n)。

什么是哈希函数

哈希表本质上是一个数组,只是数组只能根据下标,像a[0] a[1] a[2] a[3] 这样来访问,而哈希表的key则是以字符串类型为主的。

通过哈希函数,我们可以把字符串或其他类型的key,转化成数组的下标index。

如给出一个长度为8的数组,则:

当key=001121时,

index = HashCode ("001121") % Array.length = 7

当key=this时,

index = HashCode ("this") % Array.length = 6

paste image

什么是哈希冲突

不同的key通过哈希函数获得的下标有可能是相同的,例如002936这个key对应的数组下标是3,002947对应的数组下标也是3,这种情况就是哈希冲突。

paste image

如何解决哈希冲突

  1. 开放寻址法:例子Threadlocal。

paste image

  1. 链表法:例子HashMap。
    paste image

什么是树

树(tree)是n(n≥0)个节点的有限集。

当n=0时,称为空树。在任意一个非空树中,有如下特点:

  • 有且仅有一个特定的称为根的节点。

  • 当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。

树的遍历

深度优先

前序:根节点、左子树、右子树。

paste image

中序:左子树、根节点、右子树。

paste image

后序:左子树、右子树、根节点。

paste image

实现方式:递归或栈。

广度优先

层序:一层一层遍历。

paste image

实现方式:队列。

二叉树

paste image

什么是二叉树

二叉树(binary tree)是树的一种特殊形式。二叉,顾名思义,这种树的每个节点最多有2个孩子节点。注意,这里是最多有2个,也可能只有1个,或者没有孩子节点。

什么是满二叉树

一个二叉树的所有非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。

什么是完全二叉树

对一个有n个节点的二叉树,按层级顺序编号,则所有节点的编号为从1到n。如果这个树所有节点和同样深度的满二叉树的编号为从1到n的节点位置相同,则这个二叉树为完全二叉树。

二叉查找树

什么是二叉查找树

二叉查找树在二叉树的基础上增加了以下几个条件:

  • 如果左子树不为空,则左子树上所有节点的值均小于根节点的值;

  • 如果右子树不为空,则右子树上所有节点的值均大于根节点的值;

  • 左、右子树也都是二叉查找树。
    paste image

二叉查找树的作用

  • 查找==》二分查找;
  • 排序==》中序遍历。

二叉树的实现方式

  • 链表;
  • 数组:对于稀疏二叉树来说,数组表示法是非常浪费空间的。

二叉堆

什么是二叉堆

二叉堆是一种特殊的完全二叉树,它分为两个类型:最大堆和最小堆。

  • 最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值;

  • 最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值。
    paste image

二叉堆的基本操作

  1. 插入:插入最末,节点上浮。

paste image

  1. 删除:删除头节点,尾节点放到头部,再下沉。

paste image

  1. 构建二叉堆:二叉树==》二叉堆,所有非叶子节点依次下沉。
    paste image

二叉堆的实现方式

数组:
paste image

坚持原创技术分享,您的支持将鼓励我继续创作!