A. 學習數據結構,有哪些值得推薦的好書
作者:向小剛
鏈接:https://www.hu.com/question/19987046/answer/13945644
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
1. CLRS 演算法導論
演算法網路全書,只做了前面十幾章的習題,便感覺受益無窮。
2. Algorithms 演算法概論
短小精悍,別據一格,准經典之作。一個壞消息: 同演算法導論,該書沒有習題答案。好消息:習題很經典,難度也適中,只需花點點時間自己也都能做出來。不好也不壞的消息:我正在寫習題的答案,已完成前三章,還剩九章約二百道題,順利的話二個月之後發布。另有中文版名《演算法概論》,我沒看過,不知道翻譯得怎麼樣。如果有心的話,還是盡量看原版吧,其實看原版與看中文版花費時間不會相差很大,因為大部分時間其實都花費在做習題上了。
dr. dobb's essential books on Algorithm and daba structure
3. Algorithm Design 演算法設計
很經典的一本書,很久之前看的,遺憾的是現在除了就記得它很經典之外其它都忘光了。
4. SICP 計算機程序的構造和解釋
六星之書無需多言,雖然這不是一本講演算法的書,但看完此書有助於你更深入的理解什麼是遞歸。我一直很強調習題,看完此書後你至少應該做完前四章的太部分習題。否則那是你的遺憾,也是作者的遺憾。
5. Concrete Mathematics 具體數學
有人說看TAOCP之前應該先弄清楚這本書的內容,要真是如此的話那我恐怕是看不到TAOCP了。零零碎碎的看了一大半,很多東西都沒有時間來好好消化。如果你是剛進大學不久的本科生,有著大把的可自由支配時間,那你幸運又幸福了,花上幾個月時間好好的讀一下此書吧,收獲絕對大於你的期望值。
6. Introction to The Design and Analysis of Algorithms 演算法設計與分析基礎
很有趣的一本演算法書,有許多在別的書上找不到的趣題,看完此書絕對能讓你大開眼界,實在是一本居家旅行,面試裝逼的必備佳作。
7. 編程之美--微軟技術面試心得
雖說是一本面試書,但如果把前面十幾頁扯掉的話,我更願意把它看作是一本講解題思維的演算法小品。在書中,作者通常是給出一個平常解法,然後再一次又一次的優化改進,你可以很清楚的看到基本的演算法設計思想是如何得到運用以解決實際問題的。如果你已經有了一些演算法的基礎,看完本書應該能使你的演算法應用能力得到一定的提高。另外,本書生動有趣,也同樣適合於初學者。
8. Fundamentals of Algorithmics 演算法基礎
也是很久之前在學校圖書館借來看的,內容記不太清楚了,只隱約記得此書的動態規劃章節猶為出彩。應該是很經典的一本書,個人以為足以和演算法導論等所謂當世經典平分秋色,但是怎麼好像被人提到的不多,或許是我孤陋寡聞了。
9. How to solve it 怎樣解題
二十世紀最偉大的數學思想家之一波利亞的力作,講一般性的解題方法:怎麼認識問題,怎麼轉換問題,怎麼解決問題,如何在問題中得到啟發,如何找到一個通往答案的方向。
10. Programming interviews exposed 程序員面試攻略
一本消遣之作。個人以為要比國內的某「XXX面試寶典」純粹一些,至少也有一些啟發性的內容,而不單單是面試題解庫。
11. Programming Pearls 編程珠璣
學習演算法不僅需要像Alogrithms,演算法導論這樣的重量級的內功心法,像《編程之美》、《編程珠璣》這樣的輕量級的輕功身法也必不可少。前些年網上不是很流行像「給你10億個數,找到最大的n個」或者「給你10億個數,找出現次數最多的那個數」之類的網路面試題嗎?看了此書你就知道怎麼解決了。相比於《編程之美》來說,本書中的示例技巧性略低一些,但是也更有實際應用價值一些。
12. 演算法藝術與信息學競賽
如果演算法導論是九陽神功,那這本無疑就是九陰真經。本書是專為參加一些諸如ACM之類程序設計比賽的同學而寫的,江湖人稱「黑書」。裡面講的都是一些在編程比賽中常用的演算法、數據結構,以及一些數論和計算幾何等。我雖然並不搞競賽,但也從此書中受益頗多。
13. An Introction to Probability Theory and Its Applications
准備看的,現在才發現概率論有多麼重要,可惜本科的時候沒有好好學。前不久一個同學問我個問題,我半天弄了一個程序給他,他說:這里就不是相關系數么,Excel一下就完事!我暈,我還真不知道那就是相關系數。
14. Numerical Analysis
這本的作者是Richard L. Burden,J. Douglas Faires
數值分析,討論各種數值演算法,比如插值、擬合、積分、微分方程的求解、線性和非線性方程組求解等。准備詳細看。
15. TAOCP 計算機程序設計藝術
傳說中的TAOCP,說的人多,看的人少。TAOCP四卷堪稱是演算法藏經閣中的易筋經或者是少林七十二絕技。天下武學,盡出少林,天下演算法,盡出TAOCP也。
B. 演算法的方法
程序調用自身的編程技巧稱為遞歸(recursion)。一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
注意:
(1) 遞歸就是在過程或函數里調用自身;
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。 貪心演算法是一種對某些求最優解問題的更簡單、更迅速的設計技術。
用貪心法設計演算法的特點是一步一步地進行,常以當前情況為基礎根據某個優化測度作最優選擇,而不考慮各種可能的整體情況,它省去了為找最優解要窮盡所有可能而必須耗費的大量時間,它採用自頂向下,以迭代的方法做出相繼的貪心選擇,每做一次貪心選擇就將所求問題簡化為一個規模更小的子問題, 通過每一步貪心選擇,可得到問題的一個最優解,雖然每一步上都要保證能獲得局部最優解,但由此產生的全局解有時不一定是最優的,所以貪婪法不要回溯。
貪婪演算法是一種改進了的分級處理方法,其核心是根據題意選取一種量度標准,然後將這多個輸入排成這種量度標准所要求的順序,按這種順序一次輸入一個量,如果這個輸入和當前已構成在這種量度意義下的部分最佳解加在一起不能產生一個可行解,則不把此輸入加到這部分解中。這種能夠得到某種量度意義下最優解的分級處理方法稱為貪婪演算法。
對於一個給定的問題,往往可能有好幾種量度標准。初看起來,這些量度標准似乎都是可取的,但實際上,用其中的大多數量度標准作貪婪處理所得到該量度意義下的最優解並不是問題的最優解,而是次優解。因此,選擇能產生問題最優解的最優量度標準是使用貪婪演算法的核心。
一般情況下,要選出最優量度標准並不是一件容易的事,但對某問題能選擇出最優量度標准後,用貪婪演算法求解則特別有效。 分治法是把一個復雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合並。
分治法所能解決的問題一般具有以下幾個特徵:
(1) 該問題的規模縮小到一定的程度就可以容易地解決;
(2) 該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質;
(3) 利用該問題分解出的子問題的解可以合並為該問題的解;
(4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。 動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。
動態規劃程序設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊演算法。不象前面所述的那些搜索或數值計算那樣,具有一個標準的數學表達式和明確清晰的解題方法。動態規劃程序設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問題,有各具特色的解題方法,而不存在一種萬能的動態規劃演算法,可以解決各類最優化問題。因此讀者在學習時,除了要對基本概念和方法正確理解外,必須具體問題具體分析處理,以豐富的想像力去建立模型,用創造性的技巧去求解。 分枝界限法是一個用途十分廣泛的演算法,運用這種演算法的技巧性很強,不同類型的問題解法也各不相同。
分支定界法的基本思想是對有約束條件的最優化問題的所有可行解(數目有限)空間進行搜索。該演算法在具體執行時,把全部可行的解空間不斷分割為越來越小的子集(稱為分支),並為每個子集內的解的值計算一個下界或上界(稱為定界)。在每次分支後,對凡是界限超出已知可行解值那些子集不再做進一步分支,這樣,解的許多子集(即搜索樹上的許多結點)就可以不予考慮了,從而縮小了搜索范圍。這一過程一直進行到找出可行解為止,該可行解的值不大於任何子集的界限。因此這種演算法一般可以求得最優解。
與貪心演算法一樣,這種方法也是用來為組合優化問題設計求解演算法的,所不同的是它在問題的整個可能解空間搜索,所設計出來的演算法雖其時間復雜度比貪婪演算法高,但它的優點是與窮舉法類似,都能保證求出問題的最佳解,而且這種方法不是盲目的窮舉搜索,而是在搜索過程中通過限界,可以中途停止對某些不可能得到最優解的子空間進一步搜索(類似於人工智慧中的剪枝),故它比窮舉法效率更高。 回溯法(探索與回溯法)是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
其基本思想是,在包含問題的所有解的解空間樹中,按照深度優先搜索的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯。(其實回溯法就是對隱式圖的深度優先搜索演算法)。 若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜索遍才結束。 而若使用回溯法求任一個解時,只要搜索到問題的一個解就可以結束。
C. 誰有一些介紹經典程序演算法設計方法的文章啊
國內的
<計算機算發設計與分析>王曉東 編著 電子工業出版社
《C 常用演算法程序集》 清華大學出版社
《計算機演算法基礎》,華中理工出版社
國外的
<<the art of computer program>>
《演算法引論》 電子工業出版社
《演算法導論(第2版)》(英文)
D. 在判斷創造性時如何考慮演算法特徵的作用
演算法的改進能夠提高計算機的內部性能,那麼在撰寫權利要求時應當體現演算法與計算機具體技術參數、結構部件等的結合,體現該演算法在整個方案中發揮的技術作用。例如,如果發明請求保護一種涉及提高硬碟訪問速度的方法和設備,其解決方案為通過改進硬碟數據的讀取和寫入演算法來提高數據訪問速度,那麼在撰寫權利要求時,不但要在權利要求中記載演算法的具體實現步驟,還要記載與硬碟數據讀寫相關的技術內容,更要寫明該演算法對計算機硬碟讀寫部件或操作在技術上的配合、影響或作用,以體現出計算機因該演算法的改進使得其訪問速度獲得更好性能,以此區別於僅僅在計算機上運行了該新的演算法。
E. 創造性的方法有哪些
1、創造性的方法——隱喻技巧
隱喻在寫作中很常見,但我們不能忽視這種創造性方法在設計中的作用。如果我們想使用隱喻,我們可以用一些東西來代替產品或元素,它們需要有一定的相似性。例如,我們會比較吃辣椒和吃火的感覺。
2、創造性的方法——不同的設計
有時,一些不同的效果也可以給我們一些視覺上的吸引力。例如,如果它從中間發散,通常會選擇一些條紋,以便光線從中間發散到四周。看起來很有創意。
3、創造性的方法——主題延伸了深刻的內容
有時候,一旦你決定了你的設計主題,你就需要把它擴展到更深的地方,這樣你就可以保持好奇心,並留下更深的印象。需要想像力和聯想才能產生更有趣和更有創意的方法。例如鑽石,它擴展了愛情的概念,將會更受歡迎。
4、創造性的方法——異質同構思維
異質同構也是一種更有創意的設計方法。它通常使用兩個或兩個以上的元素,這些元素在性質上有明顯的不同,但可以組合成一個新的元素,非常有創意,有一種復雜的統一和對比感。
在設計的過程中,我們要表現出獨特的效果,單靠靈感是很難達到的。選擇適當的創造性的方法將使我們的操作更容易,所以在設計過程中,我們必須知道靈感的重要性。後續將會有更多關於平面設計的設計技巧與資訊,可以點擊本站的其他文章進行學習。
F. 推薦一些關於演算法的書籍
1、數據結構與演算法分析:C語言描述(適合入門)
這本書相對於演算法導論要簡單一些,更適合入門。演算法導論其實有比較強的理論性,看起來比較吃力。
《數據結構與演算法分析:C語言描述》內容簡介:書中詳細介紹了當前流行的論題和新的變化,討論了演算法設計技巧,並在研究演算法的性能、效率以及對運行時間分析的基礎上考查了一些高級數據結構,從歷史的角度和近年的進展對數據結構的活躍領域進行了簡要的概括。由於《數據結構與演算法分析:C語言描述(原書第2版)》選材新穎,方法實用,題例豐富,取捨得當。《數據結構與演算法分析:C語言描述》的目的是培養學生良好的程序設計技巧和熟練的演算法分析能力,使得他們能夠開發出高效率的程序。從服務於實踐又鍛煉學生實際能力出發,書中提供了大部演算法的C程序和偽碼常式。
2、演算法設計與分析基礎(適合入門)
作者基於豐富的教學經驗,開發了一套對演算法進行分類的新方法。這套方法站在通用問題求解策略的高度,能對現有的大多數演算法都能進行准確分類,從而使本書的讀者能夠沿著一條清晰的、一致的、連貫的思路來探索演算法設計與分析這一迷人領域。本書作為第2版,相對第1版增加了新的習題,還增加了「迭代改進」一章,使得原來的分類方法更加完善。
3.0、演算法引論:一種創造性方法(適合入門)
和普通的演算法書不同,這本書從創造性的角度出發——如果說演算法導論講的是有哪些演算法,那麼演算法引論講的就是如何創造演算法。結合前面的演算法設計與分析基礎,這本書把能解決的演算法問題數量擴大了一個數量級。
3.1 演算法競賽 | 信息學奧賽一本通(算競入門)
AlphaWA同學推薦的入門書籍,網上沒有PDF版本,自己去淘寶買嘍。
3.2 演算法競賽 | 演算法競賽進階指南(算競進階)
G. 什麼是創造性思維方法
1)創造性思維,是一種具有開創意義的思維活動,即開拓人類認識新領域、開創人類認識新成果的思維活動.
2)創造性思維是以感知、記憶、思考、聯想、理解等能力為基礎,以綜合性、探索性和求新性特徵的高級心理活動。
創造性思維並非游離於其它思維形式而存在,它包括了各種思維形式。
創造性思維需要人們付出艱苦的腦力勞動。一項創造性思維成果的取得,往往要經過長期的探索、刻苦的鑽研、甚至多次的挫折之後才能取得,而創造性思維能力也要經過長期的知識積累、素質磨礪才能具備,至於創造性思維的過程,則離不開繁多的推理、想像、聯想、直覺等思維活動。
創造性思維具有以下幾方面的特點:
創造性思維具有新穎性,它貴在創新,或者在思路的選擇上、或者在思考的技巧上、或者在思維的結論上,具有著前無古人的獨到之處,在前人、常人的基礎上有新的見解、新的發現、新的突破,從而具有一定范圍內的首創性、開拓性。
創造性思維具有極大的靈活性。它無現成的思維方法、程序可循,人可以自由地海闊天空地發揮想像力。
創造性思維具有藝術性和非擬化的特點,它的對象多屬「自在之物」,而不是「為我之物」,創造性思維的結果存在著兩種可能性。
創造性思維具有著十分重要的作用和意義。首先,創造性思維可以不斷增加人類知識的總量;其次,創造性思維可以不斷提高人類的認識能力;再次,創造性思維可以為實踐活動開辟新的局面。此外,創造性思維的成功,又可以反饋激勵人們去進一步進行創造性思維。正如我國著名數學家華羅庚所說:「『人』之可貴在於能創造性地思維。」
補充:創造性思維是一種開創性的探索未知事物的高級復雜的思維,是一種有自己的特點、具有創見性的思維,是擴散思維和集中思維的辯證統一,是創造想像和現實定向的有機結合,是抽象思維和靈感思維的對立統一。創造性思維是指有主動性和創見性的思維,通過創造性思維,不僅可以提示客觀事物的本質和規律性,而且能在此基礎上產生新穎的、獨特的、有社會意義思維成果,開拓人類知識的新領域。廣義的創造性思維是指思維主體有創見,有意義的思維活動,每個正常人都有這種創造性思維。狹義的創造性思維是指思維主體發明創造、提出新的假說、創見新的理論,形成新的概念等探索未知領域的思維活動,這種創造性思維是少數人才有的。 創造性思維是在抽象思維和形象思維的基礎上和相互作用中發展起來的,抽象思維和形象思維是創造性思維的基本形式。除此之外,還包括擴散思維、集中思維、逆向思維、分合思維,聯想思維。其中擴散思維是從所給的信息中產生信息,著重點是從同一來源中產生各種各樣為數眾多的輸出,並且很可能發生移轉作用。集中思維是從所給的信息中產生邏輯的結論,其著重點是產生獨有的或者習慣上所接受的最好的成果。逆向思維是把思維方向逆轉過來,用對立的表面看來似乎不可能並有的兩條思路同時去尋找解決問題之答案的形式。分合思維是一種把思考對象在思想中加以分解或合並,然後獲得一種新的思維產物的思維方式。聯想思維是一種把已經掌握的知識與某種思維對象聯系起來,從其相關性中發現啟發點從而獲取創造性設想的的思維形式。 創造性思維是創造成果產生的必要前提和條件,而創造則是歷史進步的動力,創造性思維能力是個人推動社會前進的必要手段,特別是在知識經濟時代,創造性思維的培養訓練更顯得重要。其途徑在於豐富的知識結構、培養聯想思維的能力、克服習慣思維對新構思的抗拒性,培養思維的變通性,加強討論,經常進行思想碰撞。
H. 推薦一些演算法比較好的書
劉汝佳的《演算法藝術與信息學競賽》,這本書很適合搞演算法競賽的看。
《演算法導論》這本書就不用多說了,經典
Udi Manber 的《Introction to Algorithms: A Creative Approach》中文名《演算法引論:一種創造性方法》
當然還有很多書,上面三本我有幸看過
I. 《演算法引論-一種創造性方法》中的表達式lbn表示什麼意思
以2為低的對數
即log2(N)
J. 《演算法引論:一種創造性方法》txt全集下載
演算法引論:一種創造性方法 txt全集小說附件已上傳到網路網盤,點擊免費下載:
內容預覽: