如果想正儿八经的学习算法,首先给出3条建议:
对基础算法进行系统学习,全部手敲一遍(推荐书籍:算法四)系统进行刷题,道题入门,道题拔高,道题拿offer。找到合适的学习伙伴,多和别人讨论,形成自己的思维。1、基础数据结构和算法链表
单链表双链表循环链表哈希表
散列函数碰撞解决(冲突解决)字符串
哈夫曼压缩算法LZW压缩匹配原理(多路径匹配)状态机BF(暴风算法)KMP(看毛片算法)Sunday(这个很重要)排序查找正则表达式数据压缩树
二叉树最优二叉树(赫夫曼树))二叉查找树(BST)伸展树(splaytree分裂树)平衡二叉树AVL红黑树B树,B+,B*R树Trie树(前缀树)后缀树二叉堆(大根堆,小根堆)二项树二项堆图的算法
图的存储基本操作(建立,遍历,删除节点,添加节点)最小生成树拓扑排序关键路径最短路径:Floyd,Dijkstra,bellman-ford,spfa排序
交换排序(包括快速排序)插入排序(包括希尔排序)选择排序(包括堆排序)归并排序桶排序查找
顺序表查找:顺序查找有序表查找:二分查找块内有序:通过二分定位到块,再进行查找。动态查找:二叉排序树,AVL树,B-,B+(在查找的过程中动态生成表结构)哈希表:O(1)2、面试常考数据结构和算法DP(动态规划)大厂必问KMP校招快速排序校招BFS/DFS(广度/深度优先遍历)重要红黑树(一种自平衡的二叉查找树)校招Dijkstra:最短路径算法校招LRU社招3、算法设计思想穷举搜索法(暴力破解法,对可能的解的众多候选按照某种顺序逐一枚举和检验)递归法(斐波那契数列、快排都是典型的递归应用。关键点在于确定递归公式和确定边界条件)动态规划(将复杂的问题分解成一系列的子问题;DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出)贪心算法(找到第一个合乎心意的解法,典型题目:硬币找零问题)回溯(探针法,找不到问题答案就向回走。典型题目:八皇后问题)分治算法(将一个难以直接解决的大问题,分割成一些规模较小的相同问题,各个击破,分而治之。分治算法常用递归实现)4、书目推荐刷题Leetcode前道题(初学者建议)剑指offer(牛客网可以直接练习)程序员代码面试指南(中级读者)思维提高算法谜题编程之美(从另一个角度学习算法)基础算法四(排序,查找,图,字符串四章值得精读)编程珠玑算法设计算法引论(从创造算法的角度思考问题)算法导论(算法字典)5、编程网站Leetcode(社招练习)ACMUSACO: