算法 + 数据结构 = 程序
Pascal 之父尼古拉斯·沃斯(Nicklaus Wirth)凭借一句话获得了图灵奖,让他获得图灵奖的是他提出的著名公式:算法 + 数据结构 = 程序。
数据结构和算法是程序中的两个不同的概念,又有所联系。数据结构是数据的表示形式,算法是解决问题的流程,算法在程序中的体现是函数或方法。算法中经常用到数据结构,因此数据结构和算法之间存在密切的联系。
数据结构概述
数据结构虽然有多种类型,但是大致可以分成常用数据结构和高级数据结构两大类。
常用数据结构
常用数据结构为使用频率高的数据结构,有些编程语言中已经有常用数据结构的内部实现。常用数据结构有以下几种:
- 数组和字符串
- 链表
- 栈
- 单调栈
- 队列
- 单调队列
- 优先队列
- 哈希表
- 树
- 二叉树
- 二叉搜索树
- 二叉树
- 图
高级数据结构
高级数据结构为使用频率相对较低,且要求较高的数据结构。掌握高级数据结构的难度高于掌握常用数据结构。高级数据结构有以下几种:
- 字典树
- 并查集
- 线段树
- 树状数组
算法概述
算法的种类有很多。以下列举常见的算法:
- 排序
- 初级排序
- 插入排序
- 冒泡排序
- 选择排序
- 插入排序变种:希尔排序
- 高级排序
- 归并排序
- 堆排序
- 快速排序
- 线性时间排序
- 计数排序
- 桶排序
- 基数排序
- 初级排序
- 二分查找
- 位运算
- 前缀和
- 滑动窗口
- 双指针
- 广度优先搜索
- 深度优先搜索
- 回溯
- 图算法
- 拓扑排序
- 最短路
- 最小生成树
- 分治
- 贪心
- 动态规划
- 字符串算法
- 字符串匹配
- 字符串哈希
数学
很多算法离不开数学。例如,贪心算法的策略是每次选择局部最优解,并不是所有的问题都适合用贪心算法,对于可以用贪心算法求解的问题,需要通过数学证明贪心算法的正确性。对于动态规划算法的状态转移方程推导和正确性证明,也需要利用到数学知识。
除了算法需要数学推导和证明以外,有些算法本身就是数学知识的应用。以下列举算法中涉及到的数学方面的知识点:
- 概率与统计
- 组合数学
- 博弈(常与动态规划结合)
- 随机化
- 几何