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
* 把所有经典算法写一遍
2015-12-08 00:20:18 +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
2015-12-01 11:15:39 +08:00
### 链表
* 链表
* 双向链表
### 二叉树
2015-11-30 14:07:46 +08:00
2015-11-28 21:52:24 +08:00
* 二叉树
2015-11-30 17:31:23 +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)
2015-12-01 11:15:39 +08:00
* 散列函数
* 碰撞解决
2014-05-14 14:54:53 +08:00
###字符串算法
2015-11-30 14:05:02 +08:00
* 排序
* 查找
* BF算法
* KMP算法
* BM算法
2015-12-01 11:15:39 +08:00
* 正则表达式
* 数据压缩
2015-11-30 14:05:02 +08:00
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-11-30 18:21:29 +08:00
2015-11-30 17:59:12 +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-12-11 10:43:12 +08:00
* Hash
* 快速排序
* 快递选择SELECT
2015-11-28 21:52:24 +08:00
* BFS/DFS (广度/深度优先遍历)
* 红黑树 (一种自平衡的`二叉查找树` )
2015-12-11 10:43:12 +08:00
* KMP 字符串匹配算法
* DP (动态规划 dynamic programming)
* A*寻路算法: 求解最短路径
* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
2015-11-28 21:52:24 +08:00
* 遗传算法
* 启发式搜索
* 图像特征提取之SIFT算法
* 傅立叶变换
* SPFA(shortest path faster algorithm) 单元最短路径算法
2015-12-11 10:43:12 +08:00
2015-12-01 16:26:04 +08:00
## 海量数据处理
2015-12-11 19:27:48 +08:00
* Hash映射/分而治之
* Bitmap
* Bloom filter(布隆过滤器)
* Trie树
* 数据库索引
* 倒排索引(Inverted Index)
2015-12-01 16:26:04 +08:00
* 双层桶划分
* 外排序
2015-12-11 19:27:48 +08:00
* simhash算法
* 分布处理之Mapreduce
2015-12-01 16:26:04 +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
2014-05-10 19:50:03 +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-12-11 19:27:48 +08:00
《算法谜题》 都是思维题
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-12-11 19:27:48 +08:00
《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见介绍细致
2015-11-29 18:41:05 +08:00
### 算法设计
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
2015-12-02 15:06:16 +08:00
http://leetcode.com/
http://openjudge.cn/ 开放在线程序评测平台,可以床架自己的OJ小组
http://ac.jobdu.com/index.php 九度OJ
2014-05-13 09:19:55 +08:00
2015-12-02 15:06:16 +08:00
这有个ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html
2015-12-13 20:39:33 +08:00
### 其它
[高级数据结构和算法 ](https://www.coursera.org/learn/gaoji-shuju-jiegou/ ) 北大教授张铭老师在coursera上的课程。完成这门课之时,你将掌握多维数组、广义表、Trie树、AVL树、伸展树等高级数据结构,并结合内排序、外排序、检索、索引有关的算法,高效地解决现实生活中一些比较复杂的应用问题。当然coursera上也还有很多其它算法方面的视频课程。
[算法设计与分析 Design and Analysis of Algorithms ](https://class.coursera.org/algorithms-001/lecture ) 由北大教授Wanling Qu在coursera讲授的一门算法课程。首先介绍一些与算法有关的基础知识,然后阐述经典的算法设计思想和分析技术,主要涉及的算法设计技术是:分治策略、动态规划、贪心法、回溯与分支限界等。每个视频都配有相应的讲义(pdf文件)以便阅读和复习。
2014-05-13 09:19:55 +08:00
2015-11-30 17:31:23 +08:00
## 补充:C语言代码规范
2015-11-30 10:53:05 +08:00
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