此方法经过写出问题的一些特定的例子,分析总结其中的规律。具体而言,就是经过列举少许的特殊状况,通过分析,最后找出通常的关系。算法
问题与之前莫个算法解决过的问题类似,此时就能够举一反三,尝试改进原有算法来解决设计模式
例如,实现字符串的逆序打印,也许历来就没遇到过此问题,但将字符串逆序确定在以前是见过的。将字符串逆序的算法稍加处理,便可实现字符串的逆序打印。数组
此方法首先将问题简单化,如改变数据类型、空间大小等,而后尝试着将简化后的问题解决。数据结构
例如,在海量日志数据中提取某日访问次数最多的IP。因为数据量巨大,直接进行排序显然不惋惜,但若是数据规模不大时,采用直接排序是一种好的解决方法。能够将问题规模缩小,可使用Hash法,Hash每每能够缩小问题规模,而后再从简化过的数据里面使用其余算法找出答案。设计
为了下降问题的复杂度,不少时候都会将问题逐层分解,最后归结为一些简单的问题,这就是递归法日志
列如,在寻求全排列时,可能会感受无从下手,但仔细推敲,会发现后一种排列组合每每是前一种排列组合的基础上进行的从新排列。只要知道了前一种排列组合状况,只需将最后一个元素插入到前面各类组合的列表组合里面,就实现了目标:即先截去字符串s[1...n]中的最后一个字母,生成全部s[1...n-1]的的全排列,而后再讲最后一个字母插入到每个可插入的位置排序
将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。分治法通常包括如下三个步骤:递归
1)将问题的实例划分为几个较小的实例,最好最有相等的规模。队列
2)对这些较小的实例求解,而最多见的方法通常是递归。内存
3)如歌有必要,合并这些较小问题的解,以获得原始问题的解。
通常适用于二分查找、大整数相乘、求最大字数组和、找出伪币、金块问题、矩阵乘法、残缺棋盘、归并排序、快速排序、距离最近的点对、导线与开关等。
通常而言,时间复杂度越低的算法越高效。而更想达到时间复杂度的高效,不少时候就必须在空间上有所牺牲,用空间来换时间。而用空间换时间最有效的方法就是Hash法、大数组和位图法。
在设计题目时,每每会有一个载体,这个载体即是数据结构。如数组、链表、二叉树和图等,当窄体肯定后,可用的算法天然而然就会显现出来。可问题是不少时候并不肯定这个载体是什么,当没法肯定这个载体时,通常也就很难想到合适的方法了。
当遇到上面的问题时,能够采用最原始的思考问题的方式——轮询法。常考的数据结构与算法一共就几种,以下图
最经常使用的数据结构与算法知识点
数据结构 | 算法 | 概念 |
---|---|---|
链表 | 广度(深度)优先搜索 | 位操做 |
数组 | 递归 | 设计模式 |
二叉树 | 二分查找 | 内存管理(堆、栈等) |
树 | 排序(归并排序、快速排序等) | —— |
堆(大顶堆、小顶堆) | 树的插入/删除/查找/遍历等 | —— |
栈 | 图论 | —— |
队列 | Hash法 | —— |
向量 | 分治法 | —— |
Hash表 | 动态规划 | —— |
此种方法看似笨拙,却很实用,只要对常见的数据结构与算法烂熟于心,一点都没有问题。