本文目錄一覽:
Python之動態規划算法
動態規划算法中是將複雜問題遞歸分解為子問題,通過解決這些子問題來解決複雜問題。與遞歸算法相比,動態編程減少了堆棧的使用,避免了重複的計算,效率得到顯著提升。
先來看一個簡單的例子,斐波那契數列.
斐波那契數列的定義如下。
斐波那契數列可以很容易地用遞歸算法實現:
上述代碼,隨着n的增加,計算量呈指數級增長,算法的時間複雜度是 。
採用動態規划算法,通過自下而上的計算數列的值,可以使算法複雜度減小到 ,代碼如下。
下面我們再看一個複雜一些的例子。
這是小學奧數常見的硬幣問題: 已知有1分,2分,5分三種硬幣數量不限,用這些硬幣湊成為n分錢,那麼一共有多少種組合方法。
我們將硬幣的種類用列表 coins 定義;
將問題定義為一個二維數組 dp,dp[amt][j] 是使用 coins 中前 j+1 種硬幣( coins[0:j+1] )湊成總價amt的組合數。
例如: coins = [1,2,5]
dp[5][1] 就是使用前兩種硬幣 [1,2] 湊成總和為5的組合數。
對於所有的 dp[0][j] 來說,湊成總價為0的情況只有一種,就是所有的硬幣數量都為0。所以對於在有效範圍內任意的j,都有 dp[0][j] 為1。
對於 dp[amt][j] 的計算,也就是使用 coins[0:j+1] 硬幣總價amt的組合數,包含兩種情況計算:
1.當使用第j個硬幣時,有 dp[amt-coins[j]][j] 種情況,即amt減去第j個硬幣幣值,使用前j+1種硬幣的組合數;
2.當不使用第j個硬幣時,有 dp[amt][j-1] 種情況,即使用前j種硬幣湊成amt的組合數;
所以: dp[amt][j] = dp[amt – coins[j]][j]+dp[amt][j-1]
我們最終得到的結果是:dp[amount][-1]
上述分析省略了一些邊界情況。
有了上述的分析,代碼實現就比較簡單了。
動態規划算法代碼簡潔,執行效率高。但是與遞歸算法相比,需要仔細考慮如何分解問題,動態規劃代碼與遞歸調用相比,較難理解。
我把遞歸算法實現的代碼也附在下面。有興趣的朋友可以比較一下兩種算法的時間複雜度有多大差別。
上述代碼在Python 3.7運行通過。
python中有哪些簡單的算法?
你好:
跟你詳細說一下python的常用8大算法:
1、插入排序
插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度為O(n^2)。是穩定的排序方法。插入算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間才有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。
2、希爾排序
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因DL.Shell於1959年提出而得名。 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
3、冒泡排序
它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
4、快速排序
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
5、直接選擇排序
基本思想:第1趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;第2趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;以此類推,第i趟在待排序記錄r[i] ~ r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。
6、堆排序
堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即A[PARENT[i]] = A[i]。在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。
7、歸併排序
歸併排序是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。
歸併過程為:比較a[i]和a[j]的大小,若a[i]≤a[j],則將第一個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此循環下去,直到其中一個有序表取完,然後再將另一個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的算法我們通常用遞歸實現,先把待排序區間[s,t]以中點二分,接着把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。
8、基數排序
基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部分資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為O (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
關於Python 的一些問題
在python命令行下面輸入:
help(int)
help(valueError)
可以看到 int, valueError的說明文檔。
python算法有哪些
算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間複雜度與時間複雜度來衡量。
一個算法應該具有以下七個重要的特徵:
①有窮性(Finiteness):算法的有窮性是指算法必須能在執行有限個步驟之後終止;
②確切性(Definiteness):算法的每一步驟必須有確切的定義;
③輸入項(Input):一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸 入是指算法本身定出了初始條件;
④輸出項(Output):一個算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒 有輸出的算法是毫無意義的;
⑤可行性(Effectiveness):算法中執行的任何計算步驟都是可以被分解為基本的可執行 的操作步,即每個計算步都可以在有限時間內完成(也稱之為有效性);
⑥高效性(High efficiency):執行速度快,佔用資源少;
⑦健壯性(Robustness):對數據響應正確。
相關推薦:《Python基礎教程》
五種常見的Python算法:
1、選擇排序
2、快速排序
3、二分查找
4、廣度優先搜索
5、貪婪算法
python包含什麼算法
Python基礎算法有哪些?
1.
冒泡排序:是一種簡單直觀的排序算法。重複地走訪過要排序的數列,一次比較兩個元素,如果順序錯誤就交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該排序已經完成。
2.
插入排序:沒有冒泡排序和選擇排序那麼粗暴,其原理最容易理解,插入排序是一種最簡單直觀的排序算法啊,它的工作原理是通過構建有序序列,對於未排序數據在已排序序列中從後向前排序,找到對應位置。
3.
希爾排序:也被叫做遞減增量排序方法,是插入排序的改進版本。希爾排序是基於插入排序提出改進方法的排序算法,先將整個待排序的記錄排序分割成為若干個子序列分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全記錄進行依次直接插入排序。
4. 歸併排序:是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法Divide and的一個非常典型的應用。
5. 快速排序:由東尼·霍爾所發展的一種排序算法。又是一種分而治之思想在排序算法上的典型應用,本質上快速排序應該算是冒泡排序基礎上的遞歸分治法。
6.
堆排序:是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質,即子結點的鍵值或索引總是小於它的父結點。
7.
計算排序:其核心在於將輸入的數據值轉化為鍵存儲在額外開闢的數組空間中,作為一種線性時間複雜度的排序,計算排序要求輸入的數據必須是具有確定範圍的整數。
原創文章,作者:VFTO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/133586.html