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