當前位置:首頁 » 操作系統 » 演算法導論如何

演算法導論如何

發布時間: 2023-08-17 10:21:37

『壹』 有哪些好的c/c++演算法的書

能推薦的書籍:演算法導論(原書第3版) 這一本書的思路和我很類似,都是以偽代碼的思路展開,但是與我相比,欠缺的是如何轉為實際代碼。演算法(第4版) 這一本書各種圖例,很淺顯易懂,但是是Java。數據結構與程序設計 C++語言編寫,我以前的大學教材,習題很值得一做。Data Structures & Algorithm Analysis in C++ (9780132847377): Mark A. Weiss: Books C++11編寫,若你想要C++11編寫的數據結構教材,可以參看這本書。HackerRank 練習Data Structures 與 Algorithms版塊,題目難度循循漸進。著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。若是演算法的話,我個人認為是不應該局限於C/C++的,只是目前很多書籍會以 演算法 ---- XXXX 語言實現 來作為講解,其中一個原因是目標讀者熟悉這種語言。而在推薦書籍前,我想給你我認為一種學習演算法的方式,然後你再看書籍時按照這樣的方法學,或許會好一點點。不過這是我的一言,若你覺得適合你就採用,若覺得不好,也可以再摸索出適合自己的方式,適合自己的才是最好的。我認為我們若初學演算法,可以分為兩步,第一步,思考清楚演算法,你可以使用自己最舒服的表達方式來記錄你的思考流程。我舉一個例子,如 bubble sort ,你不必最開始就想著如何用 C/C++來寫,你可以考慮清楚bubble sort到底是什麼,然後流程方法是什麼,然後記錄下來。那麼,我來回答這個問題會是類似這樣,bubble sort是一種排序的方法,它可以把給入的元素序列進行排序。

『貳』 《演算法導論》三種解遞歸式的方法

代入法可以用來確定一個遞歸式的上界或下界。這種方法很有效,但只能用於解的形式很容易猜的情形。

例如,我們需要確定下面遞歸式的上界:

該遞歸式與歸並排序相似,我們可以猜測其解為

代入法要求證明,恰當選擇常數 c>0,可有 T(n)≤cn lgn。首先假設此上界對所有正數 m<n 都成立,特別是對於 m=n/2,有 T(n/2)≤c(n/2)lg(n/2)。將其代入遞歸式,得到:

其中,只要 c≥1,最後一步都會成立。

並不存在通用的方法來猜測遞歸式的正確解,但總有一些試探法可以幫助做出好的猜測:

如果某個遞歸式與先前見過的類似,則可猜測該遞歸式有類似的解。如,遞歸式

看起來比較難解,因為右式 T 的自變數中加了 17,但我們可以猜測這個多出來的項對解的影響不大,因為當 n 很大時, 與 之間的差別並不大,兩者都將 n 分成均勻的兩半。

另一種方法是先證明遞歸式的較松的上下界,然後再縮小不確定性區間。例如,對遞歸式 ,因為遞歸式中有 n,而我們可以證明初始上界為 。然後,逐步降低其上界,提高其下界,直到達到正確的漸近確界 。

有時,我們或許能夠猜出遞歸式解的漸近界,但卻會在歸納證明時出現一些問題。通常,問題出在歸納假設不夠強,無法證明其准確的界,遇到這種情況時,可以去掉一個低階項來修改所猜測的界,以使證明順利進行。如下面的遞歸式:

可以猜測其解為 ,即要證明對適當選擇的 c,有 。有所猜測的界對遞歸式做替換,得到

由此無法得到 ,無論 c 的值如何。如果猜測一個更大的界,如 ,雖然這確實是上界,但事實上,所猜測的解 卻是正確的。為了證明這一點,要做一個更強的歸納假設。

從直覺上說,猜測 幾乎是正確的,只是差了一個常數 1,即一個低階項,然而,就因為差了一項,數學歸納法就無法證明出期望的結果。從所作的猜測中減去一個低階項,即 是個常數。現在有

只要 b≥ 1。這里,c 要選的足夠大,以便能處理邊界條件。

你可能會覺得從所作的猜測中減去一項有點兒與直覺不符。為什麼不是增加一項來解決問題呢?關鍵在於要理解我們是在用數學歸納法:通過對更小的值作更強的假設,就可以證明對某個給定值的更強的結論。

在運用漸近表示時很容易出錯。例如,對遞歸式 ,由假設 ,並證明

就是錯誤的,因為 c 是常數,因而錯誤地證明了 。錯誤在於沒有證明歸納假設的准確形式,即 。

有時,對一個陌生的遞歸式作一些簡單的代數變換,就會使之變成讀者較熟悉的形式。如下例子:

這個式子看上去比較難,但可以對它進行簡化,方法是改動變數。為了方便起見,不考慮數的截取整數問題,如將 化為整數。設 ,得

再設 ,得到新的遞歸式

這個式子看起來與 就非常像了,這個新的遞歸式的界是: 。將 帶回 ,有 。

有時候,畫出一個遞歸樹是一種得到好猜測的直接方法。在遞歸樹中,每一個節點都代表遞歸函數調用集合中一個子問題的代價。將樹中每一層內的代價相加得到一個每層代價的集合,再將每層的代價相加,得到的結果是所有層次的總代價。當用遞歸式表示分治演算法的運行時間時,遞歸樹的方法尤其有用。

遞歸樹最適合用來產生好的猜測,然後用代入法加以驗證。但使用遞歸樹產生好的猜測時,通常可以容忍小量的「不良量」,因為稍後就會證明所做的猜測。如果畫遞歸樹時非常地仔細,並且將代價都加了起來,那麼就可以直接用遞歸樹作為遞歸式的解的證明。

在講述例子之前,我們先來看一個幾何級數公式

對於實數 x≠1,式

是一個幾何級數(或稱指數級數),其值為

當和是無限的且 |x|<1 時,有無限遞減幾何級數

我們以遞歸式

為例來看一下如何用遞歸樹生成一個好的猜測。首先關注如何尋找解的一個上界,因為我們知道舍入對求解遞歸式通常沒有影響(此處即是我們需要忍受不精確的一個例子),因此可以為遞歸式

創建一顆遞歸樹,其中已將漸近符號改寫為隱含的常數系數 c>0。

構造的遞歸樹如下:

求所有層次的代價之和,確定整棵樹的代價:

最後的這個公式看起來不夠整潔,但我們可以再次充分利用一定程度的不精確,並利用無限遞減幾何級數作為上界。回退一步,得到:

此時,我們得到了遞歸式的一個猜測,在上面的例子里, 系數形成了一個遞減的等比級數,可知這些系數的總和的上界是常數 。由於樹根所需的代價為 ,所以根部的代價占總代價的一個常數部分。換句話說,整棵樹的總代價是由根部的代價所決定的。

事實上,如果 確實是此遞歸式的上界,那麼它一定是確界,為什麼呢?第一個遞歸調用所需要的代價是 ,所以 一定是此遞歸式的下界。

現在我們可以使用代換法來驗證猜測的正確性, 是遞歸式 的一個上界。只需要證明,當某常數 d>0, 成立。適用與前面相同的常數 c>0,有

只要 d≥ ,最後一步都會成立。

上圖是遞歸式

對應的遞歸樹。我們還是使用 c 來代表 項常數因子。當將遞歸樹內各層的數值加起來時,可以得到每一層的 cn 值。從根部到葉子的最長路徑是 。因為當 時, ,所以樹的深度是 。

直覺上,我們預期遞歸式的解至多是層數乘以每層的代價,也就是 。總代價被均勻地分布到遞歸樹內的每一層上。這里還有一個復雜點:我們還沒有考慮葉子的代價。如果這棵樹是高度為 的完整二叉樹,那麼有 個葉子節點。由於葉子代價是常數,因此所有葉子代價的總和為 ,或者說 。然而,這棵遞歸樹並不是完整的二叉樹,少於 個葉子,而且從樹根往下的過程中,越來越多的內部結點在消失。因此,並不是所有層次都剛好需要 cn 代價;越靠近底層,需要的代價越少。我們可以計算出准確的總代價,但記住我們只是想要找出一個猜測來使用到代入法中。讓我們容忍這些誤差,而來證明上界為 的猜測是正確的。

事實上,可以用代入法來證明 是遞歸式解的上界。下面證明 ,當 d 是一個合適的正值常數,則

上式成立的條件是 。因此,沒有必要去更准確地計算遞歸樹中的代價。

主方法給出了求解遞歸式的「食譜」方法,即將規模為 n 的問題劃分為 a 個子問題的演算法的運行時間,每個子問題規模為 ,a 和 b 是正常數。a 個子問題被分別遞歸地解決,時間各為 。劃分原問題和合並答案的代價由函數 描述。

從技術正確性角度來看,遞歸式實際上沒有得到很好的定義,因為 可能不是一個整數。但用 向上取整或向下取整來代替 a 項 並不影響遞歸式的漸近行為,因而,在寫分治演算法時略去向下取整和向上取整函數會帶給很大的方便。

其中我們將 n/b 解釋為 n 除以 b 的向下取整或向上取整。那麼 T(n) 有如下漸近界:

在使用主定理之前,我們需要花一點時間嘗試理解它的含義。對於三種情況的每一種,將函數 f(n) 與函數 進行比較。直覺上,兩個函數較大者決定了遞歸式的解。若函數 更大,如情況 1,則解為 T(n)= ( )。若函數 f(n) 更大,如情況 3,則解為 T(n)= (f(n))。若兩個函數大小相當,如情況 2,則乘上一個對數因子,解為 T(n)= ( )= ( )。

另外還有一些技術問題需要加以理解。在第一種情況下,不僅要有 小於 ,還必須是多項式地小於,也就是說, 必須漸近小於 ,要相差一個因子 ,其中 是大於 0 的常數。在第三種情況下,不是 大於 就夠了,而是要多項式意義上的大於,而且還要滿足「正則」條件 。

注意:三種情況並沒有覆蓋所有可能的 f(n)。當 f(n) 只是小於 但不是多項式地小於時,在第一種情況和第二種情況之間就存在一條「溝」。類似情況下,當 f(n) 大於 ,但不是多項式地大於時,第二種情況和第三種情況之間就會存在一條「溝」。如果 f(n) 落在任一條「溝」中,或是第三種情況種規則性條件不成立,則主方法就不能用於解遞歸式。

使用主方法很簡單,首先確定主定理的哪種情況成立,即可得到解。

例如:

對於這個遞歸式,我們有 a=9,b=3,f(n)=n,因此 = = 。由於 f(n) = ,其中 , 因此可以應用於主定理的情況 1,從而得到解 T(n) = Θ( ) 。

現在考慮

其中,a = 1, b = 3/2, f(n) = 1,因此 = = = 1 。由於 f(n) = = Θ(1) ,因此可應用於情況2,從而得到解 T(n) = Θ( ) 。

對於遞歸式

我們有 a = 3,b = 4,f(n) = nlgn,因此 = =O( )。由於 當 n,其中 ,因此,如果可以證明正則條件成立,即應用於情況 3。當 n 足夠大時,對於 , ,因此,由情況 3,遞歸式的解為 T(n)= ( )。

主方法不能用於如下遞歸式:

雖然這個遞歸式看起來有恰當的形式:a=2,b=2, ,以及 。你可能錯誤地認為應該應用情況 3,因為 漸近大於 。問題出現在它並不是多項式意義上的大於。對任意正常數 ,比值 都漸近小於 。因此,遞歸式落入了情況 2 和情況 3 之間的間隙。

證明分為兩部分。第一部分分析「主」遞歸式 ,並作了簡化假設 僅定義在 b>1 的整數冪上,即 , , ,…。這部分從直覺上說明該定理為什麼是正確的。第二部分說明如何將分析擴展至對所有的正整數 n 都成立,主要是應用數學技巧來解決向下取整函數和向上取整函數的處理問題。

取正合冪時的證明

對於遞歸式

此時的假設是 n 為 b>1 的正合冪,且 b 不必是整數。分析可分成三個引理說明,第一個引理是將解原遞歸式的問題歸約為對一個含和式的求值的問題。第二個引理決定含和式的界,第三個引理把前兩個合在一起,證明當 n 為 b 的正合冪時主定理成立。

引理一 :設 a≥1,b>1 為常數,f(n) 為定義在 b 的正合冪上的非負函數。定義 如下:

其中 i 是正整數,則有

證明:如下圖。根節點代價為 f(n),它有 a 個子女,每個代價是 。(為方便起見可將 a 視為整數,但這對數學推導沒什麼影響。)每個子女又各有 a 個子女,代價為 。這樣就有 個結點離根的距離為 2。一般地,距根為 j 的結點有 個,每一個的代價為 。每一個葉結點的代價為 ,每一個都距根 ,因為 。樹中共有 個葉結點。

可以將樹中各層上的代價加起來而得到方程 ,第 j 層上內部結點的代價為 ,故各層內部結點的總代價和為

在其所基於的分治演算法中,這個和值表示了將問題分解成為子問題並將子問題的解合並時所花的代價,所有葉子的代價(即解 個規模為 1 的子問題的代價)為 。

根據遞歸樹,主定理的三種情況對應於樹中總代價的三種情況:1、由所有葉子節點的代價決定;2、均勻分布在各層上;3、由根結點的代價決定。

引理二 :設 a≥1,b≥1 為常數, 為定義在 b 的整數冪上的非負函數。函數 由下式定義

對 b 的整數冪,該函數可被漸近限界為:

證明:對情況 1,有 ,這隱含著 。用它對方程 做代換,得

對 O 標記內的式子限界,方法是提出不變項並作簡化,得到一個上升幾何級數:

因為 b 與 都是常數,最後的表達式可化簡為 。用此表達式對 作替換,得

情況 1 得以驗證。

為證情況 2,假設 ,有 。用此式對方程 作替換,得

對 記號中的式子做類似情況 1 中的限界,但所得並非是幾何級數,而是每項都是相同的:

用此方程對 中的和式做替換,有

則情況 2 得以驗證。情況 3 也可以用類似的方式證明。

引理三 :設 a≥1,b>1 是常量, 是定義在 b 的整數冪上的非負函數。定義 T(n) 如下:

其中 i 是正整數。對於 b 的整數冪,T(n) 可有如下漸近界:

證明:用引理二給出的界來對引理一中的式 求值。對情況 1 有

對情況 2 有

對情況 3 有

『叄』 最近打算看演算法導論,在如何看方面有什麼好的建議

演算法導論,不適合入門,建議有數據結構和高等數學基礎再讀
這書上面有些內容太難了,剛開始不適合全看,挑些自己能看懂的來學。
很適合演算法初學者體會演算法的魅力.這本書講解的很全面.演算法都用偽碼實現.對編程語言要求不高.書的前幾章是一些數學和概率基礎和演算法分析的一些說明.後面幾章是一些演算法的描述.對NP問題感興趣的話.可以看看這本書的VII部分中的NP-Completeness.我覺得這本書比較好的一部分是它的附錄部分.對前面的一些背景知識公式進行了詳細的闡述和證明以及一些專有名詞進行了索引方便檢索.這本書在國內目前只有英文版的.但南大有個中文版的(不過他們太無恥了居然說是他們自己編著)我看了那個版本的.其實是第一版的中文翻譯叫<現代計算機常用數據結構和演算法>.其他的我想我不需要多說了.有興趣的可以去體會一下,

『肆』 《演算法導論》與《演算法設計》選擇哪本更好

總的來說,兩本各有所長,建議可以都涉及涉及一下,然後根據自己重點學習哪個。另外我覺得想自學演算法,我認為吧,就是看學寫無數演算法,然後就可以信手拈來的自己去寫。同時如果自學演算法,我的建議是最好是多思考多動手(可以結合現實當中的各種程序演算法,想一下他們怎麼用演算法寫出來的,就比如飯堂里刷卡算錢等等。。如何用演算法做到的。。),這樣自學就很有意義了。

『伍』 問下,演算法導論是看英文版還是中文版的好如果英文版的話哪裡能買到,亞馬遜和京東似乎都沒有

建議讀中文的。
分析:
1.《演算法導論》是一本可謂「面面俱到」的書,其中對演算法的證明佔了很大的比重,這在一般的演算法書中並不多見,也是它嚴謹性的體現。中英文在理解上的區別也就在於如何引出這個演算法、演算法為什麼正確上。但是這些證明雖然有重要意義,但是在實用價值上一般比不上演算法本身。我自己在學習演算法的時候都是先了解演算法思想,再了解演算法執行過程,再記住代碼,然後做題,最後再來回顧導引和證明,即先知其然,再知其所以然。不能光知其然,那樣無法掌握思想,思想才是精髓;而一上來就直奔證明,又缺乏學習效率。(也可能這只是我個人的特點)就演算法執行過程本身,中英文都一樣,而且由於偽代碼本身並無區別,所以先讀中文,以掌握演算法。
2.當參加國際比賽的時候,題目都是用英文描述;當對演算法的研究再上一個層次的時候,國內的譯材已經不能夠滿足學習需要了。要想進步,達到高層次的領域,實現「出色」和「領先」,就一定要大量研讀外國文獻。這要求英語必須要好。
綜上,我的建議是:讀中文版《演算法導論》,掌握演算法,再看解釋,理解它,才能更好地運用。學好英語,為達到更高的層次做准備。《演算法導論》內容非常豐富,應該讀好幾遍,到時候再看英文的也不遲。

『陸』 學習數據結構,有哪些值得推薦的好書

作者:向小剛
鏈接: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也。

熱點內容
編程分享家 發布:2025-03-10 19:24:19 瀏覽:729
python切換路徑 發布:2025-03-10 19:21:58 瀏覽:919
數值最優化演算法與理論 發布:2025-03-10 19:09:45 瀏覽:313
p30伺服器怎麼樣 發布:2025-03-10 19:01:36 瀏覽:4
四州志是由誰編譯的 發布:2025-03-10 19:01:33 瀏覽:213
java模 發布:2025-03-10 19:00:42 瀏覽:121
資料庫查不到數據 發布:2025-03-10 18:52:16 瀏覽:482
php碼農 發布:2025-03-10 18:45:45 瀏覽:791
centos7編譯安裝php 發布:2025-03-10 18:32:48 瀏覽:493
電腦上什麼安卓模擬器 發布:2025-03-10 18:32:47 瀏覽:21