1. 程式人生 > >Python之算法基礎

Python之算法基礎

個數 算法 當我 過多 輸出 老師 系統 剛才 重復執行

1》遞歸相關:

  遞歸:遞歸算法是一種直接或間接地調用自身算法的過程,在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且 易於理解;
  特點:

    (1)遞歸就是在過程或函數中調用自身;
    (2)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口;
    (3)遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低,所以一般不提倡使用遞歸算法設計程序;
    (4)在遞歸調用的過程當中系統為每一層的返回點,局部量等開辟了棧來存儲,遞歸次數過多容易造成棧溢出等,所以一般不提倡使用遞歸算法設計 程序;
  要求:
    遞歸算法所體現的“重復”一般有三個要求:
    (1)每次調用在規模上都有所縮小(通常是減半);
    (2)相鄰兩次重復直接有緊密的聯系,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入);
    (3)在問題的規模極小時必須用直接給出解答而不再進行遞歸調用,因而每次遞歸調用都是有條件的(以規模未達到直接解答的大小為條件),無條 件遞歸調用將會成為死循環而不能正常結束;
  示例:

技術分享

技術分享

2》通過遞歸實現裴波那契數列(每個數總是等於前兩個數的值的數列):

技術分享

3》算法基礎之二分查找:

技術分享

上圖會找不到1,現做出改正:

       技術分享

4》算法基礎之二維數組:

1>生成列表方法:

      技術分享

   2>生成二維數組方法:

      技術分享

       eg:將一個二維數組翻轉90度:
        自己做的:

         技術分享

參考老師代碼:

            技術分享

5》算法基礎之冒泡排序:

    技術分享

6》時間復雜度介紹:  

  1>時間頻度:

     一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機進行測試才能知道,當我們可能也沒有必要對每個算法都上機測試,只需知道哪個算 法花費等待時間多,哪個算法花費的時間少就可以了;並且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費 時間就多,一個算法中的語句執行次數稱為語句頻度或者時間頻度,記為T(n);
 2>時間復雜度:
    在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化;但有時我們也想指定它變化時呈現什麽規律,為此,我們 引入時間復雜度概念;一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大 時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數,記作T(n)=O(f(n)),稱O(f(n))為算法的漸進時
間復雜度,簡稱時間復雜度;
 3>指數時間:
  指的是一個問題求解所需要的計算時間m(n),依輸入數據的大小n而呈指數成長(即輸入數據的數量依線性成長,所花的時間將會以指數成長)
 4>示例:

第一個for循環的時間復雜度為O(n),第二個for循環的時間復雜度為O(n^2),則整個算法的時間復雜度為O(n+n^2)=O(n^2); 技術分享

  5>常數時間:
    若對於一個算法,T(n)的上界與輸入大小無關,則稱其具有常數時間,記作O(1)時間;一個例子是訪問數組中的單個元素,因為訪問它只需要一條指 令,但是,找到無序數組中的最小元素則不是,因為這需要遍歷所有元素找到最小值,這是一項線性時間的操作,或稱O(n)時間;但如果預先知道元素的數 量並假設數量保持不變,則該操作也可被稱為具有常數時間;
6>對數時間:
    若算法的T(n)=O(log n),則稱其具有對數時間;常見的具有對數時間的算法有二叉樹的相關操作和二分搜索;對數時間的算法是非常有效的,因為每增加 一個輸入,其所需要的額外計算時間會變小;遞歸將字符串砍半並且輸出是這個類別函數的一個簡單例子;
7>線性時間:
    如果一個算法的時間復雜度為O(n),則稱這個算法具有線性時間,或O(n)時間,非正式地說,這意味著
對於足夠大的輸入,運行時間增加的大小與輸入成線性關系。例如,一個計算列表所有元素的和的程序,需要的時間與列表的長度成正比;

Python之算法基礎