2014-05-05 19:44:01 +08:00
|
|
|
|
|
2015-11-29 18:46:59 +08:00
|
|
|
|
>算法虐我千百遍,我待算法如初恋
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
2015-11-29 18:46:59 +08:00
|
|
|
|
这里的内容是我学习算法过程的一些记录,希望能一直坚持下去。
|
2014-05-06 14:38:24 +08:00
|
|
|
|
|
2014-05-05 19:44:01 +08:00
|
|
|
|
##学习方法
|
2014-05-05 19:51:33 +08:00
|
|
|
|
|
2015-11-29 18:46:59 +08:00
|
|
|
|
* 把所有经典算法写一遍
|
|
|
|
|
|
* 看算法源码
|
|
|
|
|
|
* 加入算法学习社区,相互鼓励学习
|
|
|
|
|
|
* 看经典书籍
|
|
|
|
|
|
* 刷题
|
2014-05-06 14:38:24 +08:00
|
|
|
|
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
|
|
|
|
|
##基本数据结构和算法
|
|
|
|
|
|
|
2014-05-05 19:46:31 +08:00
|
|
|
|
这些算法全部自己敲一遍:
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
###二叉树
|
2015-11-30 14:07:46 +08:00
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 二叉树
|
|
|
|
|
|
* 二叉查找树
|
2015-11-30 14:07:46 +08:00
|
|
|
|
|
|
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 伸展树(splay tree 分裂树)
|
|
|
|
|
|
* 平衡二叉树AVL
|
|
|
|
|
|
* 红黑树
|
|
|
|
|
|
* B树,B+,B*
|
|
|
|
|
|
* R树
|
2015-11-30 14:07:46 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* Trie树(前缀树)
|
|
|
|
|
|
* 后缀树
|
|
|
|
|
|
* 最优二叉树(赫夫曼树)
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 二叉堆 (大根堆,小根堆)
|
|
|
|
|
|
* 二项树
|
|
|
|
|
|
* 二项堆
|
|
|
|
|
|
* 斐波那契堆(Fibonacci Heap)
|
2015-11-30 14:07:46 +08:00
|
|
|
|
|
2014-05-05 19:46:31 +08:00
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
###哈希表/散列表 (Hash Table)
|
2014-05-05 19:46:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
###字符串算法
|
|
|
|
|
|
|
2015-11-30 14:05:02 +08:00
|
|
|
|
* 排序
|
|
|
|
|
|
* 查找
|
|
|
|
|
|
* BF算法
|
|
|
|
|
|
* KMP算法
|
|
|
|
|
|
* BM算法
|
|
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
###图的算法
|
|
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 图的存储结构和基本操作(建立,遍历,删除节点,添加节点)
|
|
|
|
|
|
* 最小生成树
|
|
|
|
|
|
* 拓扑排序
|
|
|
|
|
|
* 关键路径
|
|
|
|
|
|
* 最短路径: Floyd,Dijkstra,bellman-ford,spfa
|
2014-05-05 19:46:31 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
### 排序算法
|
|
|
|
|
|
|
2015-10-19 11:15:50 +08:00
|
|
|
|
**交换排序算法**
|
2015-10-19 11:31:52 +08:00
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 冒泡排序
|
|
|
|
|
|
* 插入排序
|
|
|
|
|
|
* 选择排序
|
|
|
|
|
|
* 希尔排序
|
2015-11-28 21:57:07 +08:00
|
|
|
|
*
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 快排
|
|
|
|
|
|
* 归并排序
|
|
|
|
|
|
* 堆排序
|
2014-05-14 14:54:53 +08:00
|
|
|
|
|
2015-10-19 11:15:50 +08:00
|
|
|
|
**线性排序算法**
|
2015-10-19 11:31:52 +08:00
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 基数排序
|
2014-05-13 17:10:46 +08:00
|
|
|
|
|
|
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
### 查找算法
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* 顺序表查找:顺序查找
|
|
|
|
|
|
* 有序表查找:二分查找
|
|
|
|
|
|
* 分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到`块`中顺序查找
|
|
|
|
|
|
* 动态查找: 二叉排序树,AVL树,B- ,B+ (这里之所以叫 `动态查找表`,是因为表结构是查找的过程中动态生成的)
|
|
|
|
|
|
* 哈希表: O(1)
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
|
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
###15个经典基础算法
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* A*寻路算法: 求解最短路径
|
2015-11-30 14:07:46 +08:00
|
|
|
|
* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
|
2015-11-28 21:52:24 +08:00
|
|
|
|
* DP (动态规划 dynamic programming)
|
|
|
|
|
|
* BFS/DFS (广度/深度优先遍历)
|
|
|
|
|
|
* 红黑树 (一种自平衡的`二叉查找树`)
|
|
|
|
|
|
* KMP 字符串匹配算法
|
|
|
|
|
|
* 遗传算法
|
|
|
|
|
|
* 启发式搜索
|
|
|
|
|
|
* 图像特征提取之SIFT算法
|
|
|
|
|
|
* 傅立叶变换
|
|
|
|
|
|
* Hash
|
|
|
|
|
|
* 快速排序
|
|
|
|
|
|
* SPFA(shortest path faster algorithm) 单元最短路径算法
|
|
|
|
|
|
* 快递选择SELECT
|
2014-05-05 19:51:33 +08:00
|
|
|
|
|
2014-05-10 19:50:03 +08:00
|
|
|
|
|
2014-05-05 19:51:33 +08:00
|
|
|
|
|
2014-05-05 19:44:01 +08:00
|
|
|
|
## 算法设计思想
|
|
|
|
|
|
|
2014-05-05 19:51:33 +08:00
|
|
|
|
为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-11-28 21:55:02 +08:00
|
|
|
|
* 迭代法
|
|
|
|
|
|
* 穷举搜索法
|
|
|
|
|
|
* 递推法
|
2015-11-28 21:57:07 +08:00
|
|
|
|
*
|
2015-11-28 21:55:02 +08:00
|
|
|
|
* 动态规划
|
|
|
|
|
|
* 贪心算法
|
|
|
|
|
|
* 回溯
|
|
|
|
|
|
* 分治算法
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
|
|
|
|
|
http://www.chinaunix.net/old_jh/23/437639.html
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-05-10 19:50:03 +08:00
|
|
|
|
## 推荐阅读
|
|
|
|
|
|
|
2015-11-16 15:52:08 +08:00
|
|
|
|
|
2015-11-29 12:09:55 +08:00
|
|
|
|
### 刷题必备
|
2015-10-19 11:15:50 +08:00
|
|
|
|
|
2015-11-29 18:46:59 +08:00
|
|
|
|
《剑指offer》
|
|
|
|
|
|
《编程之美》
|
|
|
|
|
|
《结构之法:面试和算法心得》
|
2015-11-29 12:09:55 +08:00
|
|
|
|
|
|
|
|
|
|
### 基础
|
|
|
|
|
|
|
2015-11-29 18:41:05 +08:00
|
|
|
|
《编程珠玑》Programming Pearls
|
2015-11-29 18:47:53 +08:00
|
|
|
|
《编程珠玑(续)》
|
|
|
|
|
|
《数据结构与算法分析》
|
2015-11-29 18:41:05 +08:00
|
|
|
|
《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见简介细致
|
|
|
|
|
|
|
|
|
|
|
|
### 算法设计
|
|
|
|
|
|
|
2014-05-14 14:54:53 +08:00
|
|
|
|
《算法设计与分析基础》
|
2015-11-29 18:41:05 +08:00
|
|
|
|
《算法引论》 告诉你如何创造算法 断货
|
|
|
|
|
|
《Algorithm Design Manual》算法设计手册 红皮书
|
2015-11-29 12:09:55 +08:00
|
|
|
|
|
2015-11-29 18:41:05 +08:00
|
|
|
|
《算法导论》 是一本对算法介绍比较全面的经典书籍
|
|
|
|
|
|
|
2015-11-29 18:47:53 +08:00
|
|
|
|
《Algorithms on Strings,Trees and Sequences》
|
2015-11-29 18:41:05 +08:00
|
|
|
|
《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块
|
2014-05-10 19:53:12 +08:00
|
|
|
|
|
2015-10-19 11:10:08 +08:00
|
|
|
|
|
|
|
|
|
|
### 延伸阅读
|
|
|
|
|
|
|
2014-05-10 19:53:12 +08:00
|
|
|
|
《深入理解计算机系统》
|
|
|
|
|
|
《TCP/IP详解三卷》
|
2014-05-05 19:51:33 +08:00
|
|
|
|
《UNIX网络编程二卷》
|
|
|
|
|
|
《UNIX环境高级编程:第2版》
|
2014-05-10 19:50:03 +08:00
|
|
|
|
|
2015-11-29 18:41:05 +08:00
|
|
|
|
|
2015-11-29 18:47:53 +08:00
|
|
|
|
《The practice of programming》 Brian Kernighan和Rob Pike
|
|
|
|
|
|
《writing efficient programs》 优化
|
|
|
|
|
|
《The science of programming》 证明代码段的正确性 800块一本
|
2015-11-29 18:41:05 +08:00
|
|
|
|
|
|
|
|
|
|
|
2014-05-05 19:44:01 +08:00
|
|
|
|
## 参考链接和学习网站
|
|
|
|
|
|
|
2015-11-29 18:41:05 +08:00
|
|
|
|
### [July 博客](http://blog.csdn.net/v_july_v)
|
2014-05-06 14:38:24 +08:00
|
|
|
|
|
2014-05-10 19:50:03 +08:00
|
|
|
|
《数学建模十大经典算法》
|
|
|
|
|
|
《数据挖掘领域十大经典算法》
|
|
|
|
|
|
《十道海量数据处理面试题》
|
|
|
|
|
|
《数字图像处理领域的二十四个经典算法》
|
|
|
|
|
|
《精选微软等公司经典的算法面试100题》
|
2014-05-06 14:38:24 +08:00
|
|
|
|
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
2015-11-29 18:47:53 +08:00
|
|
|
|
[The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July)
|
|
|
|
|
|
[微软面试100题](http://blog.csdn.net/column/details/ms100.html)
|
|
|
|
|
|
[程序员编程艺术](http://blog.csdn.net/v_JULY_v/article/details/6460494)
|
2015-10-19 11:10:08 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
###基本算法演示
|
2015-11-29 18:41:05 +08:00
|
|
|
|
|
2014-05-05 19:51:33 +08:00
|
|
|
|
http://sjjg.js.zwu.edu.cn/SFXX/sf1/sfys.html
|
|
|
|
|
|
http://www.cs.usfca.edu/~galles/visualization/Algorithms.html
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-10-19 11:10:08 +08:00
|
|
|
|
###编程网站
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
2014-05-05 19:53:56 +08:00
|
|
|
|
http://leetcode.com/
|
|
|
|
|
|
http://oj.leetcode.com/
|
2014-05-13 17:10:46 +08:00
|
|
|
|
http://openjudge.cn/ POJ。这有个POJ上的ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html
|
2014-05-13 09:19:55 +08:00
|
|
|
|
http://ac.jobdu.com/index.php 九度OJ
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-11-30 10:53:05 +08:00
|
|
|
|
## C语言代码规范
|
|
|
|
|
|
|
2015-11-30 10:58:22 +08:00
|
|
|
|
这里面的算法代码均使用C语言完成,养成良好的代码规范习惯,不但可以写出优质的代码,也可以更快的阅读其他优秀开源代码。代码规范主要有:
|
2015-11-30 10:53:05 +08:00
|
|
|
|
|
|
|
|
|
|
### 符号命名
|
|
|
|
|
|
|
|
|
|
|
|
**局部变量** 尽量短,能表达清楚意思即可,能简写就简写,比如"err" 表示 "error"; "fd" 表示文件描述符 ,循环变量可以使用i,j,k ;结构体成员变量不需要"m_"前缀;全局变量"g_"开头
|
|
|
|
|
|
|
2015-11-30 14:05:02 +08:00
|
|
|
|
**常量名** 全大写,单词之间"_"分割,如 "MAX_NUMBER_OF_SLAB_CLASSES" ;
|
|
|
|
|
|
|
|
|
|
|
|
**宏定义** 对于options 宏定义,适当使用前缀 ,比如:
|
2015-11-30 10:53:05 +08:00
|
|
|
|
```
|
|
|
|
|
|
/* Client classes for client limits, currently used only for
|
|
|
|
|
|
* the max-client-output-buffer limit implementation. */
|
|
|
|
|
|
#define CLIENT_TYPE_NORMAL 0 /* Normal req-reply clients + MONITORs */
|
|
|
|
|
|
#define CLIENT_TYPE_SLAVE 1 /* Slaves. */
|
|
|
|
|
|
#define CLIENT_TYPE_PUBSUB 2 /* Clients subscribed to PubSub channels. */
|
|
|
|
|
|
#define CLIENT_TYPE_MASTER 3 /* Master. */
|
|
|
|
|
|
#define CLIENT_TYPE_OBUF_COUNT 3
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2015-11-30 14:05:02 +08:00
|
|
|
|
**枚举** 使用前缀:
|
2015-11-30 10:53:05 +08:00
|
|
|
|
```
|
|
|
|
|
|
enum conn_states {
|
|
|
|
|
|
conn_listening, /**< the socket which listens for connections */
|
|
|
|
|
|
conn_new_cmd, /**< Prepare connection for next command */
|
|
|
|
|
|
conn_waiting, /**< waiting for a readable socket */
|
|
|
|
|
|
conn_read, /**< reading in a command line */
|
|
|
|
|
|
conn_parse_cmd, /**< try to parse a command from the input buffer */
|
|
|
|
|
|
conn_write, /**< writing out a simple response */
|
|
|
|
|
|
conn_nread, /**< reading in a fixed number of bytes */
|
|
|
|
|
|
conn_swallow, /**< swallowing unnecessary bytes w/o storing */
|
|
|
|
|
|
conn_closing, /**< closing this connection */
|
|
|
|
|
|
conn_mwrite, /**< writing out many items sequentially */
|
|
|
|
|
|
conn_closed, /**< connection is closed */
|
|
|
|
|
|
conn_max_state /**< Max state value (used for assertion) */
|
|
|
|
|
|
};
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2015-11-30 10:58:22 +08:00
|
|
|
|
**函数命名** 全小写,单词之间"_"分割。如"split_cmdline_strerror()"
|
2015-11-30 10:53:05 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 注释
|
|
|
|
|
|
|
|
|
|
|
|
所有注释使用 "/* 这里是注释 */ "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 其他
|
|
|
|
|
|
|
|
|
|
|
|
合理使用static,const 等关键字,能提升程序的安全性,也能避免函数命名冲突
|
2015-11-30 10:58:22 +08:00
|
|
|
|
合理使用数据类型:rel_time_t,uint8_t,uint32_t,uint64_t,size_t,off_t
|
2015-11-30 10:53:05 +08:00
|
|
|
|
|
|
|
|
|
|
|
2015-11-22 14:37:49 +08:00
|
|
|
|
## 联系
|
|
|
|
|
|
|
|
|
|
|
|
[@移动开发小冉](http://weibo.com/ranwj)
|
|
|
|
|
|
|
2014-05-05 19:44:01 +08:00
|
|
|
|
|
|
|
|
|
|
|