Data Structure - 数据结构

2018.6.7

Dummy Node:Dummy node 是一个虚拟节点,也可以认为是标杆节点。Dummy node 就是在链表表头 head 前加一个节点指向 head,即 dummy -> head。当链表的 head 有可能变化(被修改或者被删除)时,使用 dummy node 可以很好的简化代码,最终返回 dummy.next 即新的链表。

快慢指针: 所谓快慢指针中的快慢指的是指针向前移动的步长,每次移动的步长较大即为快,步长较小即为慢,常用的快慢指针一般是在单链表中让快指针每次向前移动2,慢指针则每次向前移动1。快慢两个指针都从链表头开始遍历,于是快指针到达链表末尾的时候慢指针刚好到达中间位置,于是可以得到中间元素的值。

快慢指针在链表相关问题中主要有两个应用:

  • 快速找出未知长度单链表的中间节点 设置两个指针 fast、slow 都指向单链表的头节点,其中fast的移动速度是slow的2倍,当*fast指向末尾节点的时候,slow正好就在中间了。
  • 判断单链表是否有环 利用快慢指针的原理,同样设置两个指针 fast、slow 都指向单链表的头节点,其中 fast的移动速度是slow的2倍。如果 *fast = NULL,说明该单链表 以 NULL结尾,不是循环链表;如果 *fast = *slow,则快指针追上慢指针,说明该链表是循环链表。

Binary Tree - 二叉树

  • 对任何一棵二叉树T,如果其终端结点数为 n​0​​ , 度为2的结点数为 n​2​​ , 则 n​0​​ =n​2​​ +1。因为度为1的节点对度为0的节点数目不会有影响,而每增加一个度为2的节点,总的来说,则会相应增加一个度为0的节点。
  • 树的遍历
    深度优先:先访问子节点,再访问父节点,最后访问第二个子节点。根据根节点相对于左右子节点的访问先后顺序又可细分为以下三种方式。
    前序(pre-order):先根后左再右
    中序(in-order):先左后根再右
    后序(post-order):先左后右再根
    广度优先:先访问根节点,沿着树的宽度遍历子节点,直到所有节点均被访问为止。
    Data Structure - 数据结构_第1张图片
    树的遍历

Binary Search Tree - 二叉查找树:一颗二叉查找树(BST)是一颗二叉树,其中每个节点都含有一个可进行比较的键及相应的值,且每个节点的键都大于等于左子树中的任意节点的键,而小于右子树中的任意节点的键。
使用中序遍历可得到有序数组,这是二叉查找树的又一个重要特征。

Huffman Compression - 霍夫曼压缩:用较少的比特表示出现频率最高的字符,用较多的比特表示出现频率低的字符。不会存在某一个编码是另一个编码的前缀。
Huffman 编码压缩算法 | 酷 壳 - CoolShell.cn

队列(先进先出,多用于并发)

  • Priority Queue - 优先队列:应用程序常常需要处理带有优先级的业务,优先级最高的业务首先得到服务。因此优先队列这种数据结构应运而生。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。
    优先队列可以使用数组或链表实现,从时间和空间复杂度来说,往往用二叉堆来实现。

  • Deque - 双端队列:双端队列(deque,全名double-ended queue)可以让你在任何一端添加或者移除元素,因此它是一种具有队列和栈性质的数据结构。

Heap - 堆:一般情况下,堆通常指的是二叉堆,二叉堆是一个近似完全二叉树的数据结构,即披着二叉树羊皮的数组,故使用数组来实现较为便利。子结点的键值或索引总是小于(或者大于)它的父节点,且每个节点的左右子树又是一个二叉堆(大根堆或者小根堆)。根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常被用作实现优先队列。
特点

  • 以数组表示,但是以完全二叉树的方式理解。
  • 唯一能够同时最优地利用空间和时间的方法——最坏情况下也能保证使用2NlogN 次比较和恒定的额外空间。
  • 在索引从0开始的数组中:
    父节点 i 的左子节点在位置(2i+1)
    父节点 i 的右子节点在位置(2
    i+2)
    子节点 i 的父节点在位置floor((i-1)/2)

Set: 是一种用于保存不重复元素的数据结构。常被用作测试归属性,故其查找的性能十分重要。

Graph - 图
图的表示通常使用邻接矩阵和邻接表,前者易实现但是对于稀疏矩阵会浪费较多空间,后者使用链表的方式存储信息但是对于图搜索时间复杂度较高。

  • 邻接矩阵
    设顶点个数为 V, 那么邻接矩阵可以使用 V × V 的二维数组来表示。 g[i][j]表示顶点i和顶点j的关系,对于无向图可以使用0/1表示是否有连接,对于带权图则需要使用INF来区分。有重边时保存边数或者权值最大/小的边即可。
  • 邻接表
    邻接表通过表示从顶点i出发到其他所有可能能到的边。

你可能感兴趣的:(Data Structure - 数据结构)