常见数据结构

可以说是特殊的数组,但具有(完全)二叉树的性质。一般使用堆都是使用2种:最大堆、最小堆。最小堆特点:任意一个节点值都比子节点值要小,且逐级递增。(大堆类似)。(若p为父节点,子节点访问:左2p+1,右2p+2)。根据堆的特点,因为有序性,其使用核心好处就是可以避免像普通数组一样徒劳的遍历。

​ 堆的应用:堆排序,合并有序小文件,优先级队列(高性能定时器),海量数据topK问题。找中位数(若是一组静态数据,直接数组排序,但若要维护动态数据,并快速找到中位数,适合用堆),找其他百分位的数据(比如找接口99%的响应时间,大堆存99%,小堆存1%)

​ 可以解决第K大的元素问题:Leetcode第703题、第215题。可以自己手动实现最小堆,也可用PriorityQueue(底层就是最小堆)。

解题思路是建最小堆,此堆长度为k,比如[4,2,3,1,5],k=3,对前3个建堆为:[2,3,4]。剩下的1进来,比堆顶2小,跳过,5进来比2大,替换并重新建堆为[3,4,5]。根据最小(大也是)堆的特性,堆最底层所有节点是叶子节点,他们是没儿子的,所以从最小堆的第一个非叶子节点开始堆化,也就是k/2-1。堆化代码:

// 堆化:建立长度为k的最小堆
public void heapfy(int[] a, int k, int i){
 int minPos = i;
 while(true){
     // 比较左儿子是否比i小
     if(i*2+1<k && a[i*2+1]<a[i]) minPos = i*2+1;
     // 右儿子是否比i小
     if(i*2+2<k && a[i*2+2]<a[minPos]) minPos = i*2+2;
     // 一轮下来minPos记录的是最小的节点的下标
     if(minPos==i) break;
     swap(a, minPos, i);
     i = minPos;
 }
}

​ 栈,最大的特点就是先进后出,因此使用核心就是能把操作结果逆向保存。

​ 栈的应用:函数的调用和递归(中间变量表,保护现场),单调栈(视野总和,柱状图最大矩形,最大区间),进制转换,括号匹配检验,迷宫求解,表达式求值(前缀中缀后缀表达式),简单计算器的实现,接雨水,二叉树锯齿状遍历

邻接矩阵和邻接表

​ 邻接表和邻接矩阵是图的两种常用存储表示方式,用于记录图中任意两个顶点之间的连通关系,包括权值。

  • 邻接矩阵表示法:申请一个二维数组,数组下标代表顶点,数组值代表顶点之间的连通关系。

    • 邻接矩阵的优点是可以快速判断两个顶点之间是否存在边、快速添加边或者删除边。而其缺点是如果顶点之间的边比较少,会比较浪费空间
    • 无向图的邻接矩阵是对称的,第 i 行或 第 i 列有效元素个数之和就是顶点的度。在有向图中 第 i 行有效元素个数之和是顶点的出度,第 i 列有效元素个数之和是顶点的入度。
  • 邻接表表示法:图中顶点用一个一维数组存储,与该顶点有连通关系的路径用链表存储。

    • 邻接表的优点是节省空间,只存储实际存在的边。其缺点是关注2个顶点连通性,或求顶点的度时,就可能需要遍历整个链表。
    • 无向图的同一条边在邻接表中存储的两次,如果想要知道顶点的度,只需要求出所对应链表的结点个数即可。有向图中每条边在邻接表中只出现一次,求顶点的出度只需要遍历所对应链表即可。求入度则需要遍历其他顶点的链表。

​ 当图为稀疏图、顶点较多,即图结构比较大时,更适宜选择邻接表作为存储结构。当图为稠密图、顶点较少时,或者不需要记录图中边的权值时,使用邻接矩阵作为存储结构较为合适。

字典树

​ Trie树,即字典树,也叫前缀树。常用与统计字符串数量查找字符串。优点是:最大限度地减少无谓的字符串比较。

字典树的3个基本性质:

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符都不相同。

通常字典树的插入、查询时间复杂度是O(N),N是字符串的长度。所以效率还是比较高的。但空间度可以达到26^n(若字典树只有26个英文字母),是比较耗费空间的。

布隆过滤器(Bloom Filter)

BF由一个很长的二进制向量和一系列随机映射的函数组成,通过多个Hash函数将一个元素映射到一个Bit Array中的多个点,查询的时候仅当所有的映射点都为1才能判断元素存在于集合内;BF用于检索一个元素是否在一个集合中,记忆集合求交集;优点是空间和时间效率都超过一般查询算法,缺点是有一定的误判概率和删除困难;

posted @ 2021-04-20 20:53  i%2  阅读(74)  评论(0)    收藏  举报