学习计划(总感觉会被自己打脸)
辞去烟台的工作来到北京,由于算法太弱,总是不敢投有难度的工作(算法一直是我的弱项,基本每次的算法学习计划都是半途而废/(ㄒoㄒ)/~~。)。其实我的工作/学习目标一直时围绕着数据转的,无论是数据的抓取及数据的处理、分析等等。可总是有两把利剑悬在我的头上——一是薄弱的数学基础;二是惨不忍睹的算法技能。刚面试一家做数据方面工作的公司,应聘的是基础的数据岗位,已经过了两轮技术面试,在等第三轮的经理面试(希望能过吧)。根据两轮技术面试,这个工作应该暂时用不上过难的技术,无非是一些linux系统基础操作及其它杂七杂八看文档就能开始的工作。但内功还是得修炼啊,要不基本就没上升空间,也没有机会更进一步参与自己比较感兴趣的机器学习和数据挖掘等方面的工作了。
针对当前的内功难题:数学和算法。我想着还是先从算法开始吧,毕竟数学距离实际工作的距离更远一些,算法的学习可以在工作中做一个过渡,数学只能先放下了(真TM后悔考研没好好学数学)。
针对基础算法,找了一些参考书,今天整理做一下计划:
- 算法(Robert著 第四版)
- 算法导论
- 算法技术手册
- 算法设计与分析基础 (Ananny Levitin著)
- 算法设计(王红梅编著 一本学校教材)
- 零散网络流传的文档
其中的《算法导论》比较抽象,且有很多数学推理,暂时先不看。《算法》和《算法技术手册》这两本书都比较偏工程方面一些,有一定深度且比较实用,其中主要以《算法》为主要学习参照。另外两本《算法设计与分析基础》和《算法设计与分析》是算法分析方面的,其中对算法思想的分析相当精彩,在完成《算法》的学习之后进行学习。其他的零散的文档多事一些ACM或者OJ方面的,作最后的练习用吧。
所以基本路线就是:
- 《算法》学习,可临时参考《算法技术手册》完成基础算法的学习
- 《算法设计与分析》、《算法设计与分析基础》相互参照完成算法思想的分类
- OJ、工程实践练习算法
时刻记住:
!!!数学真的很重要;算法真的很重要,!!!
高数买菜用不上,但会决定你在哪里买菜;算法在一般项目中用不到,但用到算法的工作总能支付你更多的薪水
基础算法随想(也是《算法》的框架介绍)
1、基础(代码工具、算法基础工具)
掌握实现、分析和比较算法的基本原则和方法:
- Java变成模型
- 数据抽象
- 基本数据结构
- 集合类的抽象数据类型
- 算法性能分析的方法
- 案例分析
2、排序(很多算法的基础)
有序的重新排列一个序列中的元素是非常重要的基础算法,排序算法也是很多其他算法的基石
- 插入排序
- 选择排序
- 希尔排序
- 快速排序
- 归并排序
- 堆排序
- 与排序相关的问题(优先队列、选举、归并)
3、查找(Find it or Index it!!!)
从BIG数据集中找到指定的条目是非常重要的。
二叉查找树
平衡查找树
散列表
方法之间的关系和性能对比
4、图(图,算法王者)
图的主要内容是对象和它们之间的连接,连接可能有权重和方向。利用图可以为大量重要而困难的问题建模。图算法的设计非常重要。
- 深度优先搜索
- 广度优先搜索
- 连通性问题
- Kruskal和Prim最小生成树
- Dijkstra和Bellman-Ford最短路径算法
5、字符串(不得不喝人打交道并进行数值化处理)
- 字符串是现代应用程序中的重要数据类型。
- 字符串键的排序和查找的快速算法
- 子字符串查找
- 正则表达式模式匹配算法
- 数据压缩算法
6、背景 (Biger逼格)
- 科学计算简介
- 运筹学简介
- 计算理论简介
- 基于实践的模拟
- B树
- 后缀数组
- 最大流量问题
- 搜索问题、问题转化、NP完全性
目标:理解精巧、复杂和高难度算法,熟悉优雅、朴素和简单的算法。进行算法式思考。