《程式設計師實用演算法》試讀 1 2修改演算法

2022-02-12 06:41:16 字數 846 閱讀 3586

在計算機領域,一項正在進行的工作是,通過對演算法進行改進以求獲得最佳的效能。這種工作通常採用以下兩種策略之一:優化現有的演算法或者開發新的演算法。這些策略具有截然不同的目標,應當加以區別看待。在優化演算法的時候,一般不會嘗試使其效能方程降級。例如,我們知道氣泡排序的平均效能是o(n2-n)。如果你必須使用氣泡排序,那麼將希望確定在氣泡排序中執行的動作所耗費的時間非常短。也就是說,希望它的兩個主要操作(比較列表中的元素並交換它們)執行得非常快。在應用程式的上下文中,需要付出相當大的努力來確保演算法的實現是經過完全優化的。例如,需要確保在記憶體中而不是在磁碟上交換元素。通過處理每個資料項的處理所需的時間,可以節省大量的執行時間。通過對應用程式定製這種時間可有效地優化演算法。不過,你還是無法避開以下事實:氣泡排序演算法隨著資料輸入規模的增大,其效能開銷也將呈幾何級數增長。為了解決這個問題,就需要使用或設計一種新演算法。

此時,開發人員的工作將經歷從高度實用(優化)到抽象的過程。現在必須找到一種新方法,其效能比o(n2-n)更好。如果成功地使效能方程降級,就開發出了一種新演算法。這種區別是重要的,因為它將以你的方法作為條件。在幾乎所有的情況下,需要分析廣泛的解決方案,選擇其中之一,然後根據具體情況對其進行優化。在這個過程中,需要理解這個演算法是如何工作的,以便確定優化工作最好的努力方向。

首先,應該應用標準技術:使輸入/輸出(i/o)減到最小,減少函式呼叫的次數,限制計算密集型操作,比如浮點運算和頻繁使用除法運算。然後,必須確定執行得最頻繁的演算法元素。在氣泡排序中,比較和交換應該是需要強烈關注的主題。最後,要檢查可能由於疏忽而導致特別緩慢的實現。最後這一點往往與查詢最壞情況相似。你正在查詢可能導致效能下降的任何不尋常的情況。通常,這些情況將出現在實現細節的深處,並且是乙個通常合理但偶爾代價高昂的基本假定的結果。乙個已知的示例是前面討論過的快速排序演算法。

程式設計師基礎演算法

1.a 搜尋演算法 圖形搜尋演算法,從給定起點到給定終點計算出路徑。其中使用了一種啟發式的估算,為每個節點估算通過該節點的最佳路徑,並以之為各個地點排定次序。演算法以得到的次序訪問這些節點。因此,a 搜尋演算法是最佳優先搜尋的範例。2.集束搜尋 又名定向搜尋,beam search 最佳優先搜尋演算...

程式設計師練習演算法的幾個實用技巧

上週在公司內部分享了自己練習演算法的心得和經驗,有小夥伴表示分享的內容給他帶來了價值,也很具備參考意義,於是就演算法寫成文章分享出來,近幾個月來,自己每週都會花1 2小時在 leetcode 上面練習演算法,短短幾個月下來也陸陸續續交出 40 50 的解題作業,算是乙個小小的里程碑吧,以下是我最近的...

程式設計師演算法練習二

無重複字元的最長子串 給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而...