數據結構與算法目錄(http://www.javashuo.com/article/p-qvigrlkr-da.html)html
數據之間的相互關係稱爲邏輯結構。一般分爲四類基本結構:java
數據結構在計算機中有兩種不一樣的存儲方法:算法
一個算法花費的時間與算法中語句的執行次數成正比例,哪一個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱爲語句頻度或時間頻度。記爲 T(n)數據結構
在剛纔提到的時間頻度中,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)) 爲算法的漸進時間複雜度,簡稱 時間複雜度。函數
隨着問題規模 n 的增大,常數部分的影響愈來愈小
T(n) = 2n2 + 4n +log2n + 4指針
隨着問題規模 n 的増大,增加最快的項影響愈來愈大
T(n) = 2n2 + 4n + log2n + 4code
漸進時間複雜度只關注增加最快的項
T(n) = O(n2) // 去除常數係數,去除複雜度小的項htm
logn 通常表示 log2nblog
有時候,算法中基本操做重複執行的次數還隨問題的輸入數據集不一樣而不一樣,如在冒泡排序中,輸入數據有序而無序,其結果是不同的。此時,咱們計算平均值。
常見的算法的時間複雜度之間的關係爲:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(2n)<O(n!) < O(nn)
實例 1: T(n) = 1 + n + 2n2 = O(n2)
sum=0; // 執行 1 次 for(i=1;i<=n;i++) // 執行 n 次 for(j=1;j<=n;j++) // 執行 n^2 次 sum++; // 執行 n^2 次
實例 2:T(n) = 1 + 4n = O(n)
a=0; b=1; // 執行 1 次 for (i=1;i<=n;i++) { // 執行 n 次 s=a+b; // 執行 n 次 b=a; // 執行 n 次 a=s; // 執行 n 次 }
實例 3:T(n) = O(log2n)
i=1; // 執行 1 次 while (i<=n) i=i*2; // 設頻度是 f(n),則:2^f(n)<=n; f(n)<=log2n
空間複雜度:算法所需存儲空間的度量,記做:
S(n) = O(f(n))
其中 n 爲問題的規模。
一個算法在計算機存儲器上所佔用的存儲空間,包括存儲算法自己所佔用的存儲空間,算法的輸入輸出數據所佔用的存儲空間和算法在運行過程當中臨時佔用的存儲空間這三個方面。若是額外空間相對於輸入數據量來講是個常數,則稱此算法是原地工做。
算法的輸入輸出數據所佔用的存儲空間是由要解決的問題決定的,是經過參數表由調用函數傳遞而來的,它不隨本算法的不一樣而改變。存儲算法自己所佔用的存儲空間與算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的算法。
天天用心記錄一點點。內容也許不重要,但習慣很重要!