算法的複雜度:算法
概念:算法效率的度量是經過時間複雜度和空間複雜度來描述的。 時間複雜度: 概念: 1)一個語句的頻度是指該語句在算法中被重複執行的次數。算法中全部語句的頻度之和記做T(n),它是該算法問題規模n的函數,時間複雜度主要分析T(n)的數量級。 2)算法中基本運算(注:基本運算是指最深層循環內的語句)的頻度與T(n)同數量級,故咱們一般 用算法中基本運算的頻度f(n)來分析算法的時間複雜度。 表示: 1)算法的時間複雜度記爲:T(n)=O(f(n)) 2)其中"O"的定義:若T(n)和f(n)是定義在正整數集合上的兩個函數,則存在正常數C和n0,使得當n>=n0時,都知足0<=T(n)<=C*f(n) 3)取f(n)中隨n增加最快的項(並將其係數置爲1)做爲時間複雜度的度量。 eg:若f(n)=a*n^3 + b*n^2 + c*n ,則該算法的時間複雜度爲O(n^3) 4)在分析一個程序的時間複雜度時,通常遵循如下兩條規則: 1>加法規則 T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) 2>乘法規則 T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)) 常見的時間複雜度: O(1)<O(logN)<O(N)<O(NlogN)<O(N^2)<O(N^3)<O(2^N)<O(N!)<O(N^N) 1)常數級別:O(1) 典型代碼:普通語句 eg: a = b + c; // 該語句的運行時間不依賴於N 2)對數級別:O(logN) 典型代碼:二分查找 說明: 若a^x=N,則x叫作以a爲底N的對數,記做:x=logaN,其中a叫作對數的底數,N叫作真數。 對數的底數和增加的數量級無關(由於不一樣的底數至關於一個常數因子,即:loga N = b/a * Logb N),故咱們用logN表示對數增加級別。 3)線性級別:O(N) 典型代碼:單層for循環 eg:找出集合中的最大元素。 4)線性對數級別:O(NlogN) 典型代碼:分治法 eg:歸併排序 5)平方級別:O(N^2) 典型代碼:兩層循環 eg:選擇排序、插入排序 6)立方級別:O(N^3) 典型代碼:三層循環 7)指數級別:O(2^N) 典型代碼:分治法 eg:歸併排序 注意:通常老是考慮最壞的時間複雜度,以保證算法的運行時間不會比它更長。 空間複雜度: 概念: 1)算法所消耗的存儲空間是問題規模n的函數,咱們使用該函數來分析算法的空間複雜度。 表示: 1)算法的空間複雜度記爲:S(n)=O(g(n))
排序:函數
內部排序(只使用內存): 交換排序: 冒泡排序 快速排序 選擇排序: 簡單選擇排序 堆排序 插入排序: 直接插入排序 希爾排序 歸併排序 外部排序(內存和外存結合使用)