[算法与数据结构][知识点]名词解释

数据结构

[基本]

哈希,heap,priority queue,二分查找

哈夫曼树

[并查集]

  • 使用树来表示每一个集合,因为树上每一个元素都有相同的根。用根就可以用来命名所在的集合。
  • 我们可以将树存储在数组中,数组每个成员s[i]表示元素i的父亲,如果i是根,那么s[i]=-1;
  • union find两个操作

[字符串算法]

KMP

问题 : 现在有两个字符串A和B,问你在A中是否有B,有几个?
方法:构建DFA,以及在DFA上游走

Trie Tree

问题:字符串查找;字符串排序;字符串相关统计
数据结构:根节点为空;每个节点保存一个字符, 根节点到当前节点的路径构成一个字符串
优缺点:空间换时间;查询效率优于哈希表

Trie map

问题:给一个很长很长的母串 长度为n,然后给m个小的模式串。求这m个模式串里边有多少个是母串的字串
方法一: 调用m次KMP算法,时间复杂度为O((n + len(m))*m)
方法二:
AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。
https://www.cnblogs.com/cmmdc/p/7337611.html
AC自动机是构造Trie图的DFA的一种方法

后缀树

对 Text 进行预处理的字符串匹配算法,存储字符串的后缀
问题:

  • 查找字符串 Pattern 是否在于字符串 Text 中
  • 计算指定字符串 Pattern 在字符串 Text 中的出现次数
  • 查找字符串 Text 中的最长重复子串
  • 查找两个字符串 Text1 和 Text2 的最长公共部分
  • 查找给定字符串 Text 里的最长回文

https://www.cnblogs.com/gaochundong/p/suffix_tree.html

后缀数组

存储字符串后缀的数组

后缀自动机

和字符串相关的自动机。。。

  • 字符串问题
    https://www.cnblogs.com/hua-dong/p/8031093.html

单个字符串问题
1重复子串
1.1 可交叉最长重复子串 都是基本题,但是前者代码稍短
1.2 不可交叉最长重复子串 前者易于判断交叉;后者则需要记录每个状态所有出现的位置
1.3 可交叉的k次最长重复子串 后者需+二分判定;前者无需判断,直接拓扑出每个状态的次数
2子串个数问题
2.1 不相同子串个数 都是基本功能,易于实现。
3循环子串问题
3.1 求最小循环节
3.2 重复次数最多的连续重复子串

两个字符串串问题
1公共子串问题
1.1 最长公共子串
2子串个数问题
2.1 特定长度的公共子串

多个字符串问题
1公共子串问题
1.1 在k个字符串中的出现的最长子串
1.2 在每个字符串中出现k次的最长子串
1.3 在每个字符串中或反转后出现的最长子串

[区间问题]

树状数组

树状数组,二叉索引树(Binary Indexed Tree),Fenwick树

  • 问题:高效的计算数列的前缀和,区间和;注意比较线段树
  • 效率 lgn的查找、修改效率
  • 缺点:只能用于求和,不能求最大/小值;不能动态插入;数据多时,空间压力大
  • https://www.cnblogs.com/lyp-Bird/p/10544435.html

线段树

  • A.给出n个数,n<=100,和m个询问,每次询问区间[l,r]的和,并输出。

    • O(n)枚举搜索;用前缀和o(1)
  • B.给出n个数,n<=100,和m个操作,每个操作可能有两种:1、在某个位置加上一个数;2、询问区间[l,r]的和,并输出。

    • o(n)枚举; 不能用静态的前缀和做了
  • C.给出n个数,n<=1000000,和m个操作,每个操作可能有两种:1、在某个位置加上一个数;2、询问区间[l,r]的和,并输出。

    • o(n)枚举超时
  • D,给出n个数,n<=1000000,和m个操作,每个操作修改一段连续区间[a,b]的值

    • 线段树
  • 线段树是一棵二叉搜索树,它储存的是一个区间的信息

  • 每个节点以结构体的方式存储,结构体包含:
    区间左端点、右端点;(这两者必有)
    这个区间要维护的信息(事实际情况而定,数目不等)

  • 线段树的基本思想:二分

  • 每个节点的左孩子区间范围为[l,mid],右孩子为[mid+1,r]

  • 对于结点k,左孩子结点为2k,右孩子为2k+1,这符合完全二叉树的性质

  • 建树、单点查询、单点修改、区间查询、区间修改
    https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html

区间树

区间树不同于线段树:区间树是在红黑树基础上进行扩展得到的支持以区间为元素的动态集合的操作,其中每个节点的关键值是区间的左端点。通过建立这种特定的结构,可是使区间的元素的查找和插入都可以在O(lgn)的时间内完成。相比于基础的红黑树数据结构,增加了一个max[x],即以x为根的子树中所有区间的断点的最大值。
原文:https://blog.csdn.net/Yuzhiyuxia/article/details/38728997

RMQ问题

问题 : RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题
主要方法及复杂度(处理复杂度和查询复杂度)如下:

  • 1 朴素(即搜索) O(n)-O(n)
  • 2 线段树(segment tree) O(n)-O(qlogn)
  • 3 ST sparse table(实质是动态规划) O(nlogn)-O(1)
    https://kmplayer.iteye.com/blog/575725

LCA问题

问题: 当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先

  • 直接法 : 从根节点开始
  • 处理批量查询,离线算法:用Tarjan算法(在图中寻找强连通分量的算法)
    应用到要解决的LCA问题上,则是:对于新搜索到的一个结点u,先创建由u构成的集合,再对u的每颗子树进行搜索,每搜索完一棵子树,这时候子树中所有的结点的最近公共祖先就是u了
  • 在线算法 转换为RMQ问题 : 可以在线性时间里将LCA问题规约到RMQ问题,用ST算法求解,查询效率是O(1)
    https://blog.csdn.net/ywcpig/article/details/52336496
    https://www.cnblogs.com/scau20110726/archive/2013/06/14/3135095.html

[哈夫曼树]

又称最优树,是一类带权路径长度最短的树
哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树。
从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称为路径长度。
二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。

拓展:设二叉树具有n个带权值的叶子结点,则从根结点到每一个叶子结点的路径长度与该叶子结点权值的乘积之和称为二叉树路径长度,记做:
WPL = W1L1 + W2L2 + … + WnLn;
其中:n为二叉树中叶子结点的个数;Wk为第k个叶子的权值;Lk为第k个叶子结点的路径长度。

[平衡树]

红黑树

AVL树

B树系列

Treap树

tree+heap
每个节点key满足二叉搜索树;weight满足堆的性质,随机生成
对于一般的二叉搜索树,在某些特殊情况下根据输入数据来建树有可能退化为一条链,比如一个依次增大的数列。
而如果一棵二叉排序树的节点是按照随机顺序插入,得到的二叉排序树大多数情况下是平衡的,其期望高度是O(logn)。
因此Treap利用weight值作为随机因子来调整二叉树的形状,使得在大部分情况下比直接通过数据建立的二叉树要平衡。
每一次查找的期望复杂度也会降低,总体的速度也就得到了提高。
http://hihocoder.com/problemset/problem/1325

Splay树

伸展树
和Treap树不同的是,Splay树不再用一个随机的权值来进行平衡,而是用固定的调整方式来使得调整之后的树会比较平衡。
Splay树由于splay操作的使得其相较于Treap具有更大的灵活性,并且不再有随机性。其插入、查找和删除操作的均摊时间复杂度也都是O(logn)的

优点有每次查询会调整树的结构,使被查询频率高的条目更靠近树根

[van Emde Boas树]

lglgn

[左偏树及可合并堆]

给你两个优先队列,要你合并这两个优先队列,而且还要保证合并后符合优先队列的性质,时间复杂度要限制在log(s1+s2)之内。

https://blog.csdn.net/wang3312362136/article/details/80615874

斐波那契堆, 二项堆

图算法

图的遍历

广度优先搜索

深度优先搜索

最短路径

问题定义:

Dijkstra算法

* 输入
* 输出
* 算法过程
* 辅助数据结构

Bellman-Ford算法

Floyd算法

SPFA算法

最小生成树

问题定义

Prim算法

Kruscal算法

拓扑排序

问题定义

算法

二分图的最大匹配

问题定义

匈牙利算法

最大流

问题定义

增广算法

  • 压入重标,KM算法

图着色

问题定义

回溯算法

【中级】

差分约束系统

最小费用最大流

双连通分量

强连通分支和缩点

图的割边、点

最小割模型

网络流规约

【高级】

度限制最小生成树

第k最短路

最优比率生成树

最小树形图

次小生成树

图的最小环

【搜索】

深搜/宽搜

  • 广搜及优化
    利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法
  • 深搜及优化
    尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法

αβ剪枝

启发式搜索

A*
IDA*

跳舞连

精确覆盖问题

记忆化搜索

分支定界

回溯

DP

树形动态规划
四边形不等式
双端队列,单调队列,dp的状态转移

海量数据算法

大数据

  • 分而治之/hash映射 + hash统计 + 堆/快速/归并排序
  • 双层桶划分
  • Bloom filter/Bitmap
  • Trie树/数据库/倒排索引
  • 外排序
  • 分布式处理之Hadoop/Mapreduce

Bloom filter

bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中
和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。
算法:

  1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数
  2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
  3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
  4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。
    优点:不需要存储key,节省空间

缺点:

  1. 算法判断key在集合中时,有一定的概率key其实不在集合中,假阳性
  2. 无法删除

哈希技巧

哈希取余数相同的分组,
e.g.
有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词

顺序读取文件;
对每个词取id = hash(x)%5000, 把x存到5000个文件中的第id个,每个文件大约200KB,对超出1M的文件,继续哈希划分得到小于1M的文件。
对每个小文件,统计词和相应的频率(trie,hashmap),取出频率最大的100个词(用含有100个节点的最小堆),前100单词频率存到小文件(5000个);
从5000个文件中,找出前100名。//81匹马找前9名
5000个文件的第一名比一次,得到全局第一名,后900名的文件淘汰。
前一百名的文件,每个文件的前100名出来比较。
e.g.
在海量数据中找出重复次数最多的一个:
先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求

Bitmap

在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数
使用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义),共需内存2^32*2bit=1GB内存
扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变
描完后,查看bitmap,输出对应位是01的整数

TopK //81匹马找前9名,更精细的表明

思路一:
维护k个元素的最大堆;用容量为k的最大堆存储最先遍历到的k个数,建堆费时O(k)
继续遍历数列,每次遍历一个元素x,与堆顶元素比较,x<kmax,更新堆(用时logk),否则不更新堆。
总耗时 O(k+(n-k)logk)=O(nlogk)
思路二:
select(k) O(N);

海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10

  1. 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。
  2. 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据,再利用上面类似的方法求出TOP10就可以了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值