基礎算法學習路線及隨想
學習計劃(總感覺會被自己打臉)
辭去煙臺的工作來到北京,由于算法太弱,總是不敢投有難度的工作(算法一直是我的弱項,基本每次的算法學習計劃都是半途而廢/(ㄒ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完全性
目標:理解精巧、復雜和高難度算法,熟悉優雅、樸素和簡單的算法。進行算法式思考。