线性结构(排序)
树形结构
图形结构
更多数据结构
算法设计相关(分治、贪心、递归回溯、动态规划)
线性问题(排序)
O(n*n) 选择排序、 插入排序
(O(n*n) 并非一无是处,如插入排序在很多高级排序算法中都是一个很好的优化)O(n*logn) 归并排序、快速排序
归并排序可以快速求解每个数组中逆序数个数
快速排序时partition->随机化->大量重复元素时的优化 其中三路快排挺知名;快速排序还可求解k-selection问题(在无序数组中找到第k大的元素)
树形问题
①堆
堆排序是堆的很小的应用,他更重要的应用是构建优先队列。另外,索引堆也是比较重要且高级的数据结构,它能大大降低prim最小生成树算法和dijkstra算法的时间复杂度。
②另外对于树形问题,还有一种二叉查找树的树形结构,它能解决查找问题。如二分查找法,帮助我们利用排序算法对一个排好序的数组进行快速查找。二叉查找树的意义在于可以动态维护数据:我们不仅可以用它查找数据,还可快速进行插入、删除、查找、遍历及解决一些顺序相关问题(如最大值最小值、next、previous等等)。
③并查集
基于rank我们可以一步步优化并查集;路径压缩也是一种很好的优化算法。
用kruskal思想解决最小生成树问题就是使用并查集的典型例子。
图论问题
更多数据结构
比如对堆来说,除了最大堆最小堆,还有索引堆、斐波那契堆这些更加高级的堆可以加速我们的操作。
而在树这个概念下,我们介绍了二叉搜索树,但二叉搜索树可能会退化成一个链表,类似还有不少比较平衡的解决方式,如红黑树
算法设计相关
分治、贪心(选最大/选最小)、递归回溯(如树和图的遍历/搜索)、动态规划(基于最优子结构)