一堆演算法書
① 哪些學習數據結構與演算法的書籍值得推薦
大學計算機數據結構教材是 嚴蔚敏版的《數據結構》可以拿來入門。然後可以根據自己的實際情況來安排怎麼樣學習數據結構。很多人是看一遍書,然後在遇到演算法之後再去實現它。在這里列出一些我知道的演算法書籍,以供參考。(我也只看過演算法導論,編程之美)
1. CLRS 演算法導論
演算法網路全書,只做了前面十幾章的習題,便感覺受益無窮。
2. Algorithms 演算法概論
短小精悍,別據一格,准經典之作。一個壞消息: 同演算法導論,該書沒有習題答案。好消息:習題很經典,難度也適中,只需花點點時間自己也都能做出來。不好也不壞的消息:我正在寫習題的答案,已完成前三章,還剩九章約二百道題,順利的話二個月之後發布。另有中文版名《演算法概論》,我沒看過,不知道翻譯得怎麼樣。如果有心的話,還是盡量看原版吧,其實看原版與看中文版花費時間不會相差很大,因為大部分時間其實都花費在做習題上了。
作者:向小剛
鏈接:http://www.hu.com/question/19987046/answer/13945644
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
② 《我的第一本演算法書》讀後感
星期天的時候去圖書館借的這本書,當借的時也沒有仔細只是看到了標題比較感性興趣於是就借了。昨天花了大概4個小時的時間把這本讀完了。
這本書採用圖片,通過分步講解,以步驟圖的形式展現了7個數據結構基本原理和26個基礎演算法的基本原理
數據結構基本原理:
基礎演算法的基本原理:
作者:石田保輝 宮崎修一
雖然以前也看過演算法書,但是每次都感覺得不是很直觀的了解,讀完這本書後對於數據結構基本原理與演算法的基本原理,都有很直觀了解。
對於剛接觸演算法的人來說,一定要認真的完7個數據結構基本原理:(鏈表、數組、棧、隊列、哈希表、堆、二叉查找樹)可以多讀幾次,真到理解。
演算法部份:歸並排序、快速排序、二分查找、 圖的搜索、 k-means 演算法值得多閱讀
這本書主要是以步驟圖幫助讀者加深對數據結構原理和演算法執行過程的理解,沒有枯燥的理論和復雜的公式,如作為入門書來說是本非常不錯的演算法入門書,。
③ C++演算法的書籍(適合初學的)
高一凡的數據結構與演算法,c++版,適合初學者
④ 推薦一些關於演算法的書籍
1、數據結構與演算法分析:C語言描述(適合入門)
這本書相對於演算法導論要簡單一些,更適合入門。演算法導論其實有比較強的理論性,看起來比較吃力。
《數據結構與演算法分析:C語言描述》內容簡介:書中詳細介紹了當前流行的論題和新的變化,討論了演算法設計技巧,並在研究演算法的性能、效率以及對運行時間分析的基礎上考查了一些高級數據結構,從歷史的角度和近年的進展對數據結構的活躍領域進行了簡要的概括。由於《數據結構與演算法分析:C語言描述(原書第2版)》選材新穎,方法實用,題例豐富,取捨得當。《數據結構與演算法分析:C語言描述》的目的是培養學生良好的程序設計技巧和熟練的演算法分析能力,使得他們能夠開發出高效率的程序。從服務於實踐又鍛煉學生實際能力出發,書中提供了大部演算法的C程序和偽碼常式。
2、演算法設計與分析基礎(適合入門)
作者基於豐富的教學經驗,開發了一套對演算法進行分類的新方法。這套方法站在通用問題求解策略的高度,能對現有的大多數演算法都能進行准確分類,從而使本書的讀者能夠沿著一條清晰的、一致的、連貫的思路來探索演算法設計與分析這一迷人領域。本書作為第2版,相對第1版增加了新的習題,還增加了「迭代改進」一章,使得原來的分類方法更加完善。
3.0、演算法引論:一種創造性方法(適合入門)
和普通的演算法書不同,這本書從創造性的角度出發——如果說演算法導論講的是有哪些演算法,那麼演算法引論講的就是如何創造演算法。結合前面的演算法設計與分析基礎,這本書把能解決的演算法問題數量擴大了一個數量級。
3.1 演算法競賽 | 信息學奧賽一本通(算競入門)
AlphaWA同學推薦的入門書籍,網上沒有PDF版本,自己去淘寶買嘍。
3.2 演算法競賽 | 演算法競賽進階指南(算競進階)
⑤ 聚類演算法學習的經典書籍有哪些
推薦一些演算法書籍,最後面有下載鏈接,如果想要其它書籍也可以點擊那個鏈接通過自動回復獲得
《程序員的數學》
書中講 解了二進制計數法、邏輯、余數、排列組合、遞歸、指數爆炸、不可解問題等許多與編程密切相關的數學方法,分析了哥尼斯堡七橋問題、少年高斯求和方法、漢諾塔、斐波那契數列等經典問題和演算法。引導讀者深入理解編程中的數學方法和思路。
本書還對程序員和計算機的分工進行了有益的探討。讀完此書,你會對以程序為媒介的人機合作有更深刻的理解。
演算法領域的經典參考書——《演算法•第4版》
《演算法•第4版》全面介紹了關於演算法和數據結構的必備知識,並特別針對排序、搜索、圖處理和字元串處理進行了論述。第4 版具體給出了每位程序員應知應會的50 個演算法,提供了實際代碼,而且這些java 代碼實現採用了模塊化的編程風格,讀者可以方便地加以改造。本書配套網站提供了本書內容的摘要及更多的代碼實現、測試數據、練習、教學課件等資源。
《計算機程序設計藝術》系列
《卷1:基本演算法(第3版)》講解基本演算法,其中包含了其他各卷都需用到的基本內容。本卷從基本概念開始,然後講述信息結構,並輔以大量的習題及答案。
《卷2:半數值演算法(第3版)》全面講解了半數值演算法,分「隨機數」和「算術」兩章。書中總結了主要演算法範例及這些演算法的基本理論,廣泛剖析了計算機程序設計與數值分析間的相互聯系。
《卷3:排序與查找(第2版)》擴展了卷1中信息結構的內容,主要講排序和查找。書中對排序和查找演算法進行了詳細的介紹並對各種演算法的效率做了大量的分析。
《演算法的樂趣》
《演算法的樂趣》從一系列有趣的生活實例出發,全面介紹了構造演算法的基礎方法及其廣泛應用,生動地展現了演算法的趣味性和實用性。全書分為兩個部分,第一部分介紹了演算法的概念、常用的演算法結構以及實現方法,第二部分介紹了演算法在各個領域的應用,如物理實驗、計算機圖形學、數字音頻處理等。其中,既有各種大名鼎鼎的演算法,如神經網路、遺傳演算法、離散傅里葉變換演算法及各種插值演算法,也有不起眼的排序和概率計算演算法。講解淺顯易懂而不失深度和嚴謹,對程序員有很大的啟發意義。書中所有的示例都與生活息息相關,淋漓盡致地展現了演算法解決問題的本質,讓你愛上演算法,樂在其中。
《啊哈!演算法》
沒有枯燥的描述,沒有難懂的公式,一切以實際應用為出發點,通過幽默的語言配以可愛的插圖來講解演算法。你更像是在閱讀一個個輕松的小故事或是在玩一把趣味解謎 游戲,在輕松愉悅中便掌握演算法精髓,感受演算法之美。
本書中涉及的數據結構有棧、隊列、鏈表、樹、並查集、堆和圖等;涉及的演算法有排序、枚舉、 深度和廣度優先搜索、圖的遍歷,當然還有圖論中不可以缺少的四種最短路徑演算法、兩種最小生成樹演算法、 割點與割邊演算法、二分圖的最大匹配演算法等。
網頁鏈接
⑥ java數據結構書籍推薦
1. 入門級
針對剛入門的同學,建議不要急著去看那些經典書,像《演算法導論》、《演算法》這些比較經典、權威的書。雖然書很好,但看起來很費勁,如果看不完,效果會很不好。所以建議先看兩本入門級的趣味書:
《大話數據結構》
《演算法圖解》
《數據結構與演算法分析:C語言描述》
《數據結構與演算法分析:C++描述》
《數據結構與演算法分析:java語言描述》
《數據結構與演算法JavaScript描述》
《數據結構與演算法:Python語言描述》
《劍指offer》
《編程珠璣》
《編程之美》
《演算法導論》
《演算法》
《計算機程序設計藝術》
《演算法帝國》
《數學之美》
《演算法之美》
大話數據結構
將理論講的很有趣,不枯燥。作者結合生活中的例子去對每個數據結構和演算法進行講解,讓人通俗易懂。
演算法圖解
這是一本像小說一樣有趣的演算法入門書,書中有大量的圖解,通俗易懂。
看完上面一本或兩本入門級的書,你就會對數據結構和演算法有個大概認識和學習。但這些入門級的書缺少細節、不夠系統。所以想要深入的學習數據結構和演算法,光看這兩本書肯定是不夠的。
2. 不同語言的教科書
國內外很多大學都是將《數據結構和演算法分析》作為教科書。這本書非常系統、嚴謹、全面,難度適中,很適合對數據結構和演算法有些了解,並且已經掌握了至少一門語言的同學學習。針對不同的語言,分別有:
如果你不會C、C++、java,會Python或者JavaScript,可以看:
3. 面試書籍
現在很多大廠的面試都會考演算法題,這里推薦幾本面試演算法書籍:
劍指offer
為面試演算法量身定做的一本書。幾乎包含了所有常見的、經典的面試題,如果能搞懂書裡面的內容,一般公司的演算法面試都應該沒問題。
編程珠璣
這本書豆瓣評分有9分,評分很高。這本書最大的特色是講了很多海量數據的處理技巧。其他演算法書籍很少涉及海量數據。
編程之美
有些作者是微軟工程師,演算法題目較難,比較適合要面試Google、Facebook這樣的公司的人去看。
4. 經典書籍
現在數據結構與演算法最經典的書籍就是:
這三本書非常經典,但都很厚,看起來比較費勁,估計很少有人能全部看完。但如果想更深入地學一遍數據結構和演算法,還是建議去看看。
演算法導論
章節安排不是循序漸進,裡面有各種演算法正確性、復雜度的證明、推導,對數學功底有一定要求,看起來有些費勁。
演算法
偏重講演算法。內容不夠全面,對數據結構方面的知識講的不多,動態規劃這么重要的知識點卻沒有講。
計算機程序設計藝術
這本書包括很多卷,相比於其他書籍有更好的深度、廣度、系統性和全面性。但如果你對數據結構和演算法不是特別感興趣,沒有很好的數學、演算法、計算機基礎,很難把這本書讀完、讀懂。
5. 課外閱讀
有些演算法書籍也比較適合在平時悠閑的時候翻翻看看:
這些書都列舉了大量的列子來解釋說明,非常通俗易懂。
⑦ 請大俠給我推薦幾個演算法的書.因為我沒讀過,所以請在回答的時候告訴我推薦的理由,最好有內容.
《演算法導論》
本書深入淺出,全面地介紹了計算機演算法。對每一個演算法的分析既易於理解又十分有趣,並保持了數學嚴謹性。本書的設計目標全面,適用於多種用途。涵蓋的內容有:演算法在計算中的作用,概率分析和隨機演算法的介紹。本書專門討論了線性規劃,介紹了動態規劃的兩個應用,隨機化和線性規劃技術的近似演算法等,還有有關遞歸求解、快速排序中用到的劃分方法與期望線性時間順序統計演算法,以及對貪心演算法元素的討論。本書還介紹了對強連通子圖演算法正確性的證明,對哈密頓迴路和子集求和問題的NP完全性的證明等內容。全書提供了900多個練習題和思考題以及敘述較為詳細的實例研究。
目錄(Table of Contents)
前言(Preface)
第一部分(Part I) 基礎(Foundations)
第一章 計算中演算法的角色(The Role of Algorithms in Computing)
第二章 開始(Getting Started)
第三章 函數的增長率(Growth of Functions)
第四章 遞歸(Recurrences)
第五章 概率分析與隨機化演算法(Probabilistic Analysis and Randomized Algorithms)
第二部分(Part II) 排序與順序統計(Sorting and Order Statistics)
第六章 堆排序(Heapsort)
第七章快速排序(Quicksort)
第八章 線性時間中的排序(Sorting in Linear Time)
第九章 中值與順序統計(Medians and Order Statistics)
第三部分(Part III) 數據結構(Data Structures)
第十章 基本的數據結構(Elementary Data Structures)
第十一章 散列表(Hash Tables)
第十二章 二叉查找樹(Binary Search Trees)
第十三章 紅-黑樹(Red-Black Trees)
第十四章 擴充的數據結構(Augmenting Data Structures)
第四部分(Part IV) 高級的設計與分析技術(Advanced Design and Analysis Techniques)
第十五章 動態規劃(Dynamic Programming)
第十六章 貪婪演算法(Greedy Algorithms)
第十七章 分攤分析(Amortized Analysis)
第五部分(Part V) 高級的數據結構(Advanced Data Structures)
第十八章 B-樹(B-Trees)
第十九章 二項式堆(Binomial Heaps)
第二十章 斐波納契堆(Fibonacci Heaps)
第二十一章 不相交集的數據結構(Data Structures for Disjoint Sets)
第六部分(Part VI) 圖演算法(Graph Algorithms)
第二十二章 基本的圖演算法(Elementary Graph Algorithms)
第二十三章 最小生成樹(Minimum Spanning Trees)
第二十四章單源最短路徑(Single-Source Shortest Paths)
第二十五章 全對的最短路徑(All-Pairs Shortest Paths)
第二十六章 最大流(Maximum Flow)
第七部分(Part VII) 精選的主題(Selected Topics)
第二十七章 排序網路(Sorting Networks)
第二十八章矩陣運算(Matrix Operations)
第二十九章 線性規劃(Linear Programming)
第三十章 多項式與快速傅里葉變換(Polynomials and the FFT)
第三十一章 數論演算法(Number-Theoretic Algorithms)
第三十二章 字元串匹配(String Matching)
第三十三章 計算幾何學(Computational Geometry)
第三十四章 NP-完備性(NP-Completeness)
第三十五章 近似演算法(Approximation Algorithms)
第八部分(Part VIII) 附錄:數學背景(Mathematical Background)
附錄A 求和(Summations)
附錄B 集合,等等。(Sets, Etc.)
附錄C 計數與概率(Counting and Probability)
參考文獻(Bibliography)
索引(Index)
⑧ 計算機專業學演算法的都學些什麼演算法,有什麼書可以看的學的話需要些什麼基礎的
計算機演算法非常多的
A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於游戲中的NPC的移動計算,或線上游戲的BOT的移動計算上。該演算法像Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
Beam Search
束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜索於20 世紀70年代中期首先被應用於人工智慧領域,1976 年Lowerre在其稱為HARPY的語音識別系統中第一次使用了束搜索方法。他的目標是並行地搜索幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找演算法
一種在有序數組中查找某一特定元素的搜索演算法。搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜索演算法每一次比較都使搜索范圍縮小一半。
Branch and bound
分支定界(branch and bound)演算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在文件存儲和分布式系統領域有著十分廣泛的應用。數據壓縮也代表著尺寸媒介容量的增大和網路帶寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellman key exchange,簡稱「D–H」,是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra』s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹(Edsger Wybe Dijkstra)發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。比較著名的應用實例有:求解最短路徑問題,背包問題,項目管理,網路流優化等。這里也有一篇文章說得比較詳細。
歐幾里得演算法
在數學中,輾轉相除法,又稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
最大期望(EM)演算法
在統計計算中,最大期望(EM)演算法是在概率(probabilistic)模型中尋找參數最大似然估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variable)。最大期望經常用在機器學習和計算機視覺的數據聚類(Data Clustering)領域。最大期望演算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在 E 步上求得的最大似然值來計算參數的值。M 步上找到的參數估計值被用於下一個 E 步計算中,這個過程不斷交替進行。
快速傅里葉變換(FFT)
快速傅里葉變換(Fast Fourier Transform,FFT),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)。
⑨ 方法不對,看再多書你都學不會演算法
在計算機科學中,演算法通常是指一個解決問題的小程序。演算法是程序的基本組成部分,如果你想讓你的程序能夠解決一切問題,你必須懂演算法,這就是為什麼演算法在計算機編程中如此重要的原因。
如果你是一名初學者,你就必須從基礎開始,從理解演算法背後的基本概念開始,然後自己一個個地實現它們,在本文中,將和大家分享幾種最適合初學的演算法學習方法,不要再只會死讀演算法書啦,這樣你永遠雀尺慎都學不好演算法
1、閱讀書籍
毋庸置疑,書籍是學習一切知識的最好資源,它不僅能讓你詳細和准確地了解演算法,還能幫助你按照自己的節奏學習,拿一本關於演算法的好書,試著理解演算法背後的理論概念。之後再去程序中實現演算法。如果你失敗了,別擔心,書就在那裡,再看一遍演算法,再試著重新理解它,然後在程序里重新實現它。
關於演算法的書籍,之前也推薦過很多了,其實演算法相關的書籍有很多,經典的就那幾本,把它們都啃透了,技術自然更上一層樓,諸如:
2、在線課程
網上有很多很好的課程,比如你可以學習Coursera提供的演算法課程。你也可以上Udemy的課程。他們提供了許多來自著名導師的演算法課程
此外麻省理工學院(MIT)、哈佛大學(Harvard)和斯坦福大學(Stanford University)的課程也可以看看,他們的許多課程都是提供自學的。
3、視頻教程
視頻教程是理解和實現特定演算法的很好的資源。你可以在一些視頻網站上(如Youtube)搜索視頻教程,幾乎每種演算法都有大量的教程。你可以先看一段視頻來理解這個演算法,然後再實現它。
4、解決問題
用演算法解決問題是理解和學習演算法困碧的最好方法。如果你用演算法來解決實際問題,你會對演算法有一個深刻的理解,當你用不同的演算法解決不同問題時,你就可以很好的掌握它們,你可以在網上找到許多演算法問題。首先,瀏覽一遍問題描述,並嘗試找出解決問題所需的演算法。嘗試使用不同的演算法來解決相同的問題。例如,你可以同時使用BFS和DFS遍歷一個圖。
你還可以去UVA、A2oJ、SPOJ和Timus這樣的在線測評網站刷題
5、編程競賽
深入了解演算法的另一個好方法是參加各種在線競賽。它要求你在有限的時間內理解問題並實現演算法,這意味著你必須在短時間內設計出一個演算法解決方案,這將極大地幫助您在實際問題中使用演算法。
codeforce、Hackerrank和Topcoder它們是最流行的競賽編程平台,你可以在上面參加各種競賽。
6、可視化演算法
如果你是那種喜歡用可視化學習的人,那麼你可以通過可視化來學習演算法。有許多在線演算法可視化工具可以幫助你從基礎上理解演算法。
比如你可以通過Algorithm-Visualizer或VisuAlgo這樣的可視化工具。
7、博客頃敬站點
可以在internet上閱讀關於各種演算法的博客文章。有很多關於演算法的個人博客,多閱讀你可能會發現它們也很有用。
8、在線論壇上提問
如果你在實現演算法方面遇到了任何問題,你應該在各種在線論壇上具體詢問這個問題,通常會有很多大神願意幫助你解決這個問題。這樣的在線論壇諸如topcode -forum、Quora等。
9、制定學習計劃
熟能生巧,要掌握演算法的藝術,你必須制定一個學習計劃,例如,你可以在一天或一周內解決一個或幾個演算法。簡而言之,無論你做什麼,你都必須要有計劃,盡量有規律。
10、實踐!實踐!實踐!
實踐是檢驗真理的唯一標准,你實踐的越多,就越能理解和學到一些東西,沒經過實踐的方法去學習演算法你是學不會了,就算失敗了也沒關系,堅持再試一次,沒准就成功了