系統的學習演算法對乙個程式設計師是十分有必要的。mit 講授《演算法導論》的 erik demaine 教授說過:if you want to become a good programmer, you can spend 10 years programming, or spend 2 years programming and learning algorithms.
首先,熟練掌握一到兩門程式語言,這裡推薦 c/c++ ,因為 c 是最貼近馮諾依曼模型的計算模式,最切合當今硬體的設計,有利於進一步了解底層和作業系統。
然後精讀相對簡單的《資料結構與演算法分析——c語言描述》,之後再進一步精讀《演算法導論》。精讀的時候在紙上寫**即可,一定要理解每一步是怎麼執行的,畫畫中間狀態,總結背會並能夠默寫常見的演算法。業界一流的公司常會考白板程式設計,一定要練習紙上寫**,鍛鍊自己人肉查錯人肉編譯的能力。面試的時候,面試官出完題目後,不要立馬去寫**,先確保理解需求後,然後思考一下,用筆在紙上畫畫,胸有成竹再去寫。從有思路到寫出源**這個過程是需要大量練習的,沒有捷徑,這裡刷題是很必要的,推薦 leetcode
,刷三五遍後寫**自然有感覺,就如同學英語背課文培養語感一樣。
機器學習、資料探勘、自然語言處理、密碼學、計算機圖形學等,找工作常考:貪心、分治、動態規劃、樹、圖等。許多複雜實際問題的解決往往都可以分解為許多小問題然後用經典演算法進行解決的,只掌握庫是不夠的,有的問題還是需要自己做到對這些演算法的靈活運用才行。
時間複雜度常用分析方法:
常見時間複雜度,由小到大依次為:
o(1) 基本運算,+,-,* ,/ ,%,定址,hash的期望複雜度
o(logn) 二分查詢
o(n^(1/2)) 列舉約數
o(n) 線性查詢
o(nlogn) 歸併排序、快速排序的期望複雜度、基於比較排序的演算法下界
o(n^2) 樸素最近點對、單源最短路
o(n^3) floyd最短路、普通矩陣乘法
o(2^n) 列舉全部的子集
o(n*(2^n)) tsp的動態規劃演算法
o(n!) 列舉全排列
o(n^n) 列舉[1..n]的n維陣列的全部元素
通常面試往往會要求把時間複雜度優化到 o(n^2) 以下。常用的優化技巧:
演算法筆記一 概述
分析乙個演算法,主要是考量它的執行的時間代價和空間代價,而在評估時間代價時,還要分析下最好情況下的代價和最壞情況下的代價。最好情況,用來分析該演算法的最佳應用場景 最壞情況,用來確定該演算法的最長執行時間的上限 某些演算法可能會更加的關注於平均情況,當平均情況趨向於較好情況時,是有意義的,這裡就需要...
演算法學習筆記(一) 演算法概述
一 演算法 演算法就是任何良定義的計算過程,該過程將某個值或值的集合作為輸入並產生某個值或值得集合作為輸出 亦可將演算法看作是用於求正確解的計算問題的工具。一般情況下,問題陳述了期望的輸入和輸出之間的集合對映關係 而演算法則描述乙個特定的計算過程來實現問題的輸入和期望的輸出之間的對映關係。二 np問...
SVN 學習筆記一(概述)
svn概述 svn是subversion的簡稱,如今她已經是apache家族的一員。作為主流的版本管理軟體,她取代了cvs,並不斷完善。如今已經是大多數軟體開發專案使用的必不可少的工具。svn到底是什麼呢?svn 是乙個時光機,我們用他可以找回過去的一些東西 當然你不可能用他來穿越 在svn中,我們...