算法不是我所擅长的(脑子转的太慢,有些太精妙的思路虽能看懂,但要我自己想的话很难想出来或直接就想不出来o(╯□╰)o),但在实际工作/面试中会一些基础的算法又是很必要的,所以,打算多收录一些这方面的资料,等到需要用的时候查找起来也要方便一些(虽然我现在认为:在Google/Baidu(还有一些特殊类别的搜索引擎)出现了之后,你对一个东西或事件的了解程度,基本上取决于“你是不是想了解这个事件”。因为只要你会一些搜索技巧,是很容易/可以找到你需要的资料的。但是,这并不妨碍我保持“勤于/喜好整理/收集资料”的习惯,而且,有些资料并不是一直都有、可以/易于免费得到,也不是所有的网站都会是一直都在的),所以,自己做一个索引方便自己或他人参考是一件有意义的事,值得去做,然后说做就做。
备战面试中算法的五个步骤
总体来说,备战面试中的算法,分为五个步骤,如下:
1、掌握一门编程语言
首先你得确保你已掌握好一门编程语言:
- C的话,推荐Dennis M. Ritchie & Brian W. Kernighan合著的《C程序设计语言》,和《C和指针》;
- C++ 则推荐《C++ Primer》,《深度探索C++对象模型》,《Effective C++》 。
掌握一门语言并不容易,不是翻完一两本书即可了事,语言的细枝末节需要在平日不断的编程练习中加以熟练。
2、过一遍微软面试100题系列
我从2010年起开始整理微软面试100题系列,见过的题目不可谓不多,但不管题目怎般变化,依然是那些常见的题型和考察点,当然,不考察任何知识点,纯粹考察编程能力的题目也屡见不鲜。故不管千变万化,始终不离两点:①看你基本知识点的掌握情况;②编程基本功。
而当你看了一遍微软面试100题之后(不要求做完),你自会意识到:数据结构和算法在笔试面试中的重要性。
3、苦补数据结构基础
如果学数据结构,可以看我们在大学里学的任一本数据结构教材都行,如果你觉得实在不够上档次,那么可以再看看《STL源码剖析》。
4、看算法导论
《算法导论》上的前大部分的章节都在阐述一些经典常用的数据结构和典型算法(如二分查找,快速排序、Hash表),以及一些高级数据结构(诸如红黑树、B树),如果你已经学完了一本数据结构教材,那么建议你着重看贪心、动态规划、图论等内容,这3个议题每一个议题都大有题目可出。
如果算法导论看不懂,你可以参看博客。
5、刷leetcode或cc150或编程艺术系列
- 如主要在国外找工作,推荐两个面试编程网站:一个是http://leetcode.com/,leetcode是国外一网站,它上面有不少编程题;另外一个是http://www.careercup.com/,而后这个网站的创始人写了本书,叫《careercup cracking coding interview》,最终这本英文书被图灵教育翻译出版为《程序员面试金典》。
- 若如果是国内找工作,则郑重推荐我编写的《程序员编程艺术》,有编程艺术博客版,以及在博客版本基础上精简优化的编程艺术github版。除此之外,还可看看《编程之美》,与《剑指offer》。
而不论是准备国内还是国外的海量数据处理面试题,此文必看:教你如何迅速秒杀掉:99%的海量数据处理面试题。
此外,多看看优秀的开源代码,如nginx或redis,多做几个项目加以实践之。
后记
学习最忌心浮气躁,急功近利,即便练习了算法,也不一定代表能万无一失通过笔试面试关,因为总体说来,在一般的笔试面试中,70%基础+ 30%coding能力(含算法),故如果做到了上文中的5个步骤,还远远不够,最后,我推荐一份书单,以此为大家查漏补缺(不必全部看完,欢迎大家补充):
- 《深入理解计算机系统》
- W.Richard Stevens著的《TCP/IP详解三卷》,《UNIX网络编程二卷》,《UNIX环境高级编程:第2版》,详见此豆瓣页面;
- 你如果要面机器学习一类的岗位,建议看看相关的算法(如支持向量机通俗导论(理解SVM的三层境界)),及老老实实补补数学基础,包括微积分、线性代数、概率论与数理统计(除了教材,推荐一本《数理统计学简史》)、矩阵论(推荐《矩阵分析与应用》)等..
在编程和算法领域,有哪些经典问题?
一篇百度百科经典算法合集
排序
排序算法:http://baike.baidu.com/view/297739.htm
冒泡排序法:http://baike.baidu.com/view/1313793.htm
起泡法:http://baike.baidu.com/view/174304.htm
鸡尾酒排序:http://baike.baidu.com/view/1981861.htm
桶排序:http://baike.baidu.com/view/1784217.htm
计数排序:http://baike.baidu.com/view/1209480.htm
归并排序:http://baike.baidu.com/view/90797.htm
排序二叉树:http://baike.baidu.com/view/922220.html
鸽巢排序:http://baike.baidu.com/view/2020276.htm
基数排序:http://baike.baidu.com/view/1170573.htm
选择排序法:http://baike.baidu.com/view/1575807.htm
希尔排序:http://baike.baidu.com/view/178698.htm
堆排序:http://baike.baidu.com/view/157305.htm
快速排序算法:http://baike.baidu.com/view/19016.htm
插入排序法:http://baike.baidu.com/view/1443814.htm
树形选择排序:http://baike.baidu.com/view/3108940.html
========================================================
搜索
深度优先搜索:http://baike.baidu.com/view/288277.htm
宽度优先搜索:http://baike.baidu.com/view/825760.htm
启发式搜索:http://baike.baidu.com/view/1237243.htm
蚁群算法:http://baike.baidu.com/view/539346.htm
遗传算法:http://baike.baidu.com/view/45853.htm
========================================================
计算几何
凸包:http://baike.baidu.com/view/707209.html
========================================================
图论
哈夫曼编码:http://baike.baidu.com/view/95311.htm
二叉树遍历:http://baike.baidu.com/view/549587.html
最短路径:http://baike.baidu.com/view/349189.htm
Dijkstra算法:http://baike.baidu.com/view/7839.htm
A*算法:http://baike.baidu.com/view/7850.htm
SPFA算法:http://baike.baidu.com/view/682464.html
Bellman-Ford算法:http://baike.baidu.com/view/1481053.htm
floyd-warshall算法:http://baike.baidu.com/view/2749461.htm
Dijkstra算法:http://baike.baidu.com/view/7839.htm
最小生成树:http://baike.baidu.com/view/288214.htm
Prim算法:http://baike.baidu.com/view/671819.html
网络流:http://baike.baidu.com/view/165435.html
========================================================
动态规划
动态规划:http://baike.baidu.com/view/28146.htm
哈密顿图:http://baike.baidu.com/view/143350.html
递推:http://baike.baidu.com/view/3783120.htm
========================================================
动态规划优化
优先队列:http://baike.baidu.com/view/1267829.htm
单调队列:http://baike.baidu.com/view/3771451.htm
四边形不等式:http://baike.baidu.com/view/1985058.htm
========================================================
其他
随机化算法:http://baike.baidu.com/view/1071553.htm
递归:http://baike.baidu.com/view/96473.htm
穷举搜索法:http://baike.baidu.com/view/1189634.htm
贪心算法:http://baike.baidu.com/view/112297.htm
分治法:http://baike.baidu.com/view/1583824.htm
迭代法:http://baike.baidu.com/view/649495.htm
加密算法:http://baike.baidu.com/view/155969.htm
回溯法:http://baike.baidu.com/view/45.htm
弦截法:http://baike.baidu.com/view/768310.htm
迭代法:http://baike.baidu.com/view/649495.htm
背包问题:http://baike.baidu.com/view/841810.htm
http://baike.baidu.com/view/1731915.htm
八皇后问题:http://baike.baidu.com/view/698719.htm
百鸡问题:http://baike.baidu.com/view/367996.htm
二分法:http://baike.baidu.com/view/75441.htm
kmp算法:http://baike.baidu.com/view/659777.html
遗传算法:http://baike.baidu.com/view/45853.htm
矩阵乘法:http://www.douban.com/group/topic/12416781/edit
Floyd算法:http://baike.baidu.com/view/14495.html
路由算法:http://baike.baidu.com/view/2276401.html
ICP算法:http://baike.baidu.com/view/1954001.html
约瑟夫环:http://baike.baidu.com/view/717633.htm
约瑟夫问题:http://baike.baidu.com/view/213217.htm
AVL树:http://baike.baidu.com/view/414610.htm
红黑树:http://baike.baidu.com/view/133754.htm
退火算法:http://baike.baidu.com/view/335371.htm
并查集:http://baike.baidu.com/view/521705.htm
线段树:http://baike.baidu.com/view/670683.htm
左偏树:http://baike.baidu.com/view/2918906.htm
Treap:http://baike.baidu.com/view/956602.htm
Trie树:http://baike.baidu.com/view/1436495.html
RMQ:http://baike.baidu.com/view/1536346.htm
LCA :http://baike.baidu.com/view/409050.htm
矩阵乘法:http://baike.baidu.com/view/2455255.htm
高斯消元:http://baike.baidu.com/view/33268.html
银行家算法:http://baike.baidu.com/view/93075.htm
*分类参照维基百科里算法的分类 http://zh.wikipedia.org/zh-cn/%E7%AE%97%E6%B3%95
经典算法:
递归:汉诺塔,全排列的生成等
分治法:快速排序、归并排序等
贪心法:背包问题、Dijkstra、Prim算法
动态规划:0-1背包问题,各种子串问题
搜索法:N皇后问题、迷宫问题
随机算法:蒙特卡洛、随机快排等
近似算法:TSP等方面相关算法等
在线算法:K-服务器问题等
应用方面的算法:
K-Means、ID3等算法
以上都是经典的不能再经典的算法,也是算法入门必读。
算法学习初级,中级,高级各应该掌握些什么内容?
- 初级:排序、树、图…
- 中级:动态规划、组合、NP…
- 高级:专业领域(数据挖掘、自然语言处理、神经网络…)
下面列举了一些最常使用的算法,按照从基础到高级的顺序:
- 数据结构:堆、栈、队列、Bag容器、并查集、优先级队列
- 排序:选择排序、插入排序、快排、归并排序、堆排、基数排序
- 查找:二叉查找树、红黑树、哈希表
- 图论:深搜、宽搜、Prim、Kruskai、Dijkstra、Bellman-Ford、拓扑排序最短路径
- 字符串:KMP、正则匹配、TST、哈夫曼、LZW压缩算法
- 高级:B树、后缀数组、Ford-Fulkerson最大流
- 有哪些学习算法的网站推荐? – 知乎
- 排序算法 – 话题精华 – 知乎
- 一个算法是怎样应用到产品中去的? – 知乎
- 算法 | 酷壳 – CoolShell.cn
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- Algorithm – IT-Homer
《 “一些算法方面的文章索引” 》 有 9 条评论
C/C++ 语言快速排序算法
http://www.dahouduan.com/2015/02/05/c-quick-sort/
https://www.livesfree.com/kuai-su-pai-xu-cyu-yan/
https://github.com/Xuanwo/Learn/blob/master/Good/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F.c
http://www.cnblogs.com/pugang/archive/2012/06/27/2565093.html
http://www.powerxing.com/quick-sort-in-c/
http://wangkuiwu.github.io/2013/05/02/quick-sort/
https://github.com/wangkuiwu/datastructs_and_algorithm/blob/master/source/algrightm/sort/quick_sort/c/quick_sort.c
快速排序
https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
leetcode中的shell问题
https://www.tanglei.name/blog/shell-problems-in-leetcode.html
https://leetcode.com/problemset/shell/
1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几只猪?
https://www.zhihu.com/question/60227816
https://www.zhihu.com/question/19676641
https://www.zhihu.com/question/60384040
https://leetcode.com/problems/poor-pigs/#/description
LeetCode题解
https://www.gitbook.com/book/siddontang/leetcode-solution/details
https://siddontang.gitbooks.io/leetcode-solution/content/
动态规划民科教程
https://jiajunhuang.com/articles/2018_01_04-dynamic_programming.md.html
`
递归
暴力递归
记忆化
递归的思考
bottom-up
解题步骤
思路讲解
最大连续子数组和
编辑距离/最长公共子序列
0-1背包问题
爬楼梯
总结
思路的起点
递归的三种形式
缓存的几种常见形式
常见问题形式
`
Kaggle 项目实战(教程) = 文档 + 代码 + 视频
https://github.com/apachecn/kaggle
什么是动态规划?动态规划的意义是什么?
https://www.zhihu.com/question/23995189
这个网站收集 GitHub 上面的各种算法实现,按照种类和语言进行分类。每种语言都有自己的GitHub仓库,其中存储了所有算法代码。
https://the-algorithms.com/zh_Hans
https://github.com/TheAlgorithms/
《Hello 算法》:动画图解、一键运行的数据结构与算法教程,支持 Java, C++, Python, Go, JS, TS, C#, Swift, Rust, Dart, Zig 等语言。
https://github.com/krahets/hello-algo