算法导论笔记

算法导论笔记

常用算法设计方法

  • 增量方法(Incremental)
    在排好子数组A[1..j-1]后,将元素A[j]插入,形成排好序的子数组A[1..j]
  • 分治法(divide-and-conquer)
    将原问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
    分治模式在每一层递归上都有三个步骤:
    • 分解(Divide)将原问题分解成一系列子问题;
    • 解决(Conquer)递归地解决子问题,若子问题足够小,则直接求解;
    • 合并(Combine)将子问题的解合并成原问题的解。

定理

定理3.1 对于任意两个函数f(n)g(n)f(n)=θ(g(n)) 当且仅当f(n)=O(g(n))f(n)=Ω(g(n))

公式

性质

任何底大于1的指数函数比任何多项式函数增长得更快

先导

  1. 数据结构与算法概述
  2. 如何衡量算法的性能

基础篇

  1. 数组、栈、队列
  2. 链表
  3. 哈希表
  4. 双指针
  5. 模拟、枚举与递推

专题篇

  1. 二分
  2. 滑动窗口
  3. 搜索(BFS、DFS、回溯)专题
  4. 动态规划
  5. 背包
  6. 分治
  7. 贪心
  8. 位运算

进阶篇

  1. Trie树(字典树)
  2. 并查集
  3. 剪枝
  4. 字符串匹配
  5. 跳表
  6. 线段树:线段树区间合并法解决多次询问的「区间最长连续上升序列问题」和「区间最大子段和问题」

BST(Binary Search Tree又叫二叉搜索树、二叉排序树、二叉查找树)

1
2
3
4
5
6
7
8
9
10
11
12
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。

搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。

二叉搜索树是能够高效地进行如下操作的数据结构。
1.插入一个数值
2.查询是否包含某个数值
3.删除某个数值

删除节点时需要注意若删除节点只有左子树或者右子树的情况下直接删除就可以了,很好理解,但是当要删除的节点左右子树都存在的情况下,
就找到其右子树的最左孩子,与该节点交换,然后再删除该左孩子即可。

红黑树(一种平衡二叉搜索树)

能够保证在最坏情况下,基本的动态集合操作的时间为O(lgn)

定义:

一颗二叉查找树如果满足下面的红黑性质,则为一颗红黑树:

  1. 每个节点或是红的,或是黑的;
  2. 根节点是黑的;
  3. 每个叶节点(Nil)是黑的;
  4. 如果一个节点是红的,则他的两个儿子都是黑的;
  5. 对每个节点,从该节点到其子孙结点的所有路径上包含相同数据的黑节点。

AVL树

红黑树相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树

2-3-4树

指阶为4的B树

B树

根据 Knuth 的定义,一个 m 阶的B树是一个有以下属性的树:

  1. 每一个节点最多有 m 个子节点
  2. 每一个非叶子节点(除根节点)最少有 ⌈m/2⌉ 个子节点
  3. 如果根节点不是叶子节点,那么它至少有两个子节点
  4. 有 k 个子节点的非叶子节点拥有 k − 1 个键
  5. 所有的叶子节点都在同一层

跳表

贪心算法
图(Dijkstra,Hellman-Ford)
Kruskal最小生成树算法:按照边的权值从小到大排序,每次从剩余的边中选择权值较小且边的两个顶点不在同一集合内的边(不会产生回路的边)
加入到生成树中,直到加入了n-1条边为止
图的割点、割边
二分图的最大匹配

Tag

数组1097

字符串545

动态规划404

哈希表399

数学382

深度优先搜索281

排序244

广度优先搜索225

树224

贪心210

二叉树195

二分查找180

双指针172

矩阵170

数据库168

位运算149

栈139

设计129

堆(优先队列)112

回溯106

图91

链表90

模拟77

滑动窗口72

前缀和72

并查集66

计数64

递归60

二叉搜索树54

分治50

字典树49

单调栈43

有序集合37

队列37

记忆化搜索33

状态压缩32

几何32

线段树24

拓扑排序24

哈希函数22

枚举22

博弈21

数据流20

字符串匹配18

交互18

树状数组18

滚动哈希14

随机化14

最短路13

组合数学13

双向链表11

归并排序10

单调队列10

快速选择10

数论10

迭代器10

脑筋急转弯10

概率与统计9

多线程9

桶排序8

计数排序6

后缀数组5

最小生成树5

扫描线4

Shell4

水塘抽样4

强连通分量2

欧拉回路2

拒绝采样2

基数排序2

双连通分量1