文章目录
1. 分治算法
分治问题特征
- 原问题可以分解为若干规模较小的相同子问题
- 子问题相互独立
- 子问题的解可以合并为原问题的解
2. 动态规划
动态规划问题的特点
- 特点一:求一个问题的最优解
- 特点二:整体问题的最优解是依赖各个子问题的最优解
- 特点三:子问题之间还有相互重叠的更小子问题
- 特点四:由于子问题在分解大问题的过程中重复出现,为了避免重复求解子问题,我们可以用从下往上的顺序先计算小问题的最优解然后存储下来,再以此为基础求取大问题的最优解。从上往下分析问题,从下往上求解问题,这是动态规划的特点四。
3. 各类排序算法的比较
- 稳定性比较
- 时间复杂性比较
算法 | 平均情况 | 最好情况 | 最坏情况 |
---|---|---|---|
冒泡排序 | O(n^2) | O(n^2) | O(n^2) |
插入排序 | O(n^2) | O(n) | O(n^2) |
希尔排序 | |||
选择排序 | O(n^2) | O(n^2) | O(n^2) |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) |
堆排序 |
- 辅助空间比较
4.在海量的数据中找到最小的 k 个数
因为是海量的数据,所以我们不能一次性把所有的数据放入到内存当中。
- 我们可以先创建一个大小为 k 的容器来存储最小的 k 个数。
- 在输入的 n 个整数中读入一个数,如果容器中已有的数字少于 k 个,那么则直接把这个数字放入容器之中。
- 如果当容器满了之后,我们需要做这么几件事:
(1)在 k 个整数中找到最大值
(2)用待插入值和容器中这个最大值进行比较
(3)如果要插入的这个数比最大值要小,则删除最大值,插入新数;如果要插入的这个数比最大值还要大,则抛弃这个数。 - 由于每次都需要从 k 个数字中找到最大值,所以我们选择使用最大堆来作为这个容器。
- 由于每次都要找到 k 个整数中的最大值,所以我们很容易想到使用最大堆来实现。在最大堆中,根节点的值总是大于其他子树中任意结点的值。于是我们可以在 O(1) 时间内得到已有的 k 个数字中的最大值,但需要 O(longk) 的时间完成删除及插入操作。
5. 100G 数据,只有100M 内存,怎么排序?
外排序
大数据排序
100G数据,按照100M内存拆分,然后排序变为有序数据,然后写入 file1,file2…
,最后执行多路归并。
外排序的一个例子是归并排序。
5. LRU 【Least Recently Used】算法
- 操作系统中的一个思想:最近使用的页面数据在未来一段时间内任然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间任然不会被使用。基于这个思想,会存在一种缓存淘汰机制,每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据!在计算机中大量使用了这个机制,它的合理性在于优先筛选热点数据,所谓热点数据,就是最近最多使用的数据!因为,利用LRU我们可以解决很多实际开发中的问题,并且很符合业务场景。
- LRU 的实现
实现原理是利用双向链表。其中主要涉及添加、访问、修改、删除操作。