算法导论笔记
常用算法设计方法
- 增量方法(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的指数函数比任何多项式函数增长得更快
先导
- 数据结构与算法概述
- 如何衡量算法的性能
基础篇
- 数组、栈、队列
- 链表
- 树
- 哈希表
- 双指针
- 图
- 模拟、枚举与递推
专题篇
- 二分
- 滑动窗口
- 搜索(BFS、DFS、回溯)专题
- 动态规划
- 背包
- 分治
- 贪心
- 位运算
进阶篇
- Trie树(字典树)
- 并查集
- 剪枝
- 字符串匹配
- 堆
- 跳表
- 线段树:线段树区间合并法解决多次询问的「区间最长连续上升序列问题」和「区间最大子段和问题」
BST(Binary Search Tree又叫二叉搜索树、二叉排序树、二叉查找树)
1 | 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。 |
红黑树(一种平衡二叉搜索树)
能够保证在最坏情况下,基本的动态集合操作的时间为O(lgn)
定义:
一颗二叉查找树如果满足下面的红黑性质,则为一颗红黑树:
- 每个节点或是红的,或是黑的;
- 根节点是黑的;
- 每个叶节点(Nil)是黑的;
- 如果一个节点是红的,则他的两个儿子都是黑的;
- 对每个节点,从该节点到其子孙结点的所有路径上包含相同数据的黑节点。
AVL树
红黑树相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树
2-3-4树
指阶为4的B树
B树
根据 Knuth 的定义,一个 m 阶的B树是一个有以下属性的树:
- 每一个节点最多有 m 个子节点
- 每一个非叶子节点(除根节点)最少有 ⌈m/2⌉ 个子节点
- 如果根节点不是叶子节点,那么它至少有两个子节点
- 有 k 个子节点的非叶子节点拥有 k − 1 个键
- 所有的叶子节点都在同一层
跳表
贪心算法
图(Dijkstra,Hellman-Ford)
Kruskal最小生成树算法:按照边的权值从小到大排序,每次从剩余的边中选择权值较小且边的两个顶点不在同一集合内的边(不会产生回路的边)
加入到生成树中,直到加入了n-1条边为止
图的割点、割边
二分图的最大匹配