时间复杂度以及空间复杂度(大O的渐进表示法)
目錄
1.算法效率
2.時間復雜度
2.1 時間復雜度的概念
2.2 大O的漸進表示法
3.空間復雜度
1.算法效率
算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。
時間效率被稱為時間復雜度,而空間效率被稱作空間復雜度。時間復雜度主要衡量的是一個算法的運行速度,而空間復雜度主要衡量一個算法所需要的額外空間,在計算機發展的早期,計算機的存儲容量很小。所以對空間復雜度很是在乎。但是經過計算機行業的迅速發展,計算機的存儲容量已經達到了很高的程度。所以我們如今已經不需要再特別關注一個算法的空間復雜度。
2.時間復雜度
2.1 時間復雜度的概念
時間復雜度的定義:在計算機科學中,算法的時間復雜度是一個函數,它定量描述了該算法的運行時間。一個算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程序放在機器上跑起來,才能知道。但是我們需要每個算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間復雜度這個分析方式。一個算法所花費的時間與其中語句的執行次數成正比例,算法中的基本操作的執行次數,為算法的時間復雜度。
2.2 大O的漸進表示法
算法的時間復雜度通常用大O符號表述,定義為T[n] = O(f(n))。稱函數T(n)以f(n)為界或者稱T(n)受限于f(n)。 如果一個問題的規模是n,解這一問題的某一算法所需要的時間為T(n)。T(n)稱為這一算法的“時間復雜度”。當輸入量n逐漸加大時,時間復雜度的極限情形稱為算法的“漸近時間復雜度”。
請計算一下func1基本操作執行了多少次?
void func1(int N){int count = 0;for (int i = 0; i < N ; i++) {for (int j = 0; j < N ; j++) {count++;}}for (int k = 0; k < 2 * N ; k++) {count++;}int M = 10;while ((M--) > 0) {count++;}System.out.println(count); }對于第一個for循環,是一個嵌套的for循環,簡單計算可得執行了次,第二個for循環共執行了次,while循環執行了10次。
即func1執行的基本操作數:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
實際中我們計算時間復雜度時,我們其實并不一定要計算精確的執行次數,而只需要大概執行次數,那么這里我們使用大O的漸進表示法。
大O符號(Big O notation):是用于描述函數漸進行為的數學符號。
推導大O階方法:
1、用常數1取代運行時間中的所有加法常數。
??
2、在修改后的運行次數函數中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O階。 使用大O的漸進表示法以后,Func1的時間復雜度為:
過上面我們會發現大O的漸進表示法去掉了那些對結果影響不大的項,簡潔明了的表示出了執行次數。
另外有些算法的時間復雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規模的最大運行次數(上界)
平均情況:任意輸入規模的期望運行次數
最好情況:任意輸入規模的最小運行次數(下界)
例如:在一個長度為N數組中搜索一個數據x
最好情況:1次找到
最壞情況:N次找到
平均情況:N/2次找到
注意:平時所說的時間復雜度,都是在說,最壞情況。
例如:
// 計算func2的時間復雜度? void func2(int N) {int count = 0;for (int k = 0; k < 2 * N ; k++) {count++;}int M = 10;while ((M--) > 0) {count++;}System.out.println(count); }第一個for循環執行2N次,while循環執行10次,則
大O階算法:
// 計算func3的時間復雜度? void func3(int N, int M) {int count = 0;for (int k = 0; k < M; k++) {count++;}for (int k = 0; k < N ; k++) {count++;}System.out.println(count); }易知,大O階算法:
計算bubbleSort(冒泡排序)的時間復雜度?
void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}} }冒泡排序基本操作執行最好N次,最壞執行了(N*(N-1))/2次,通過推導大O階方法+時間復雜度一般看最壞, 時間復雜度為 :
計算binarySearch(二分查找)的時間復雜度?
int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end-begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;elsereturn mid;}return -1; }binarySearch(二分查找)基本操作執行最好1次,最壞O(log(2)N)次,時間復雜度為:
計算遞歸fibonacci(斐波那契)的時間復雜度?
int fibonacci(int N) {return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2); }遞歸的時間復雜度 = 遞歸的次數 * 每次遞歸執行的次數
fibonacci(斐波那契)通過計算分析發現基本操作遞歸了2^N次,時間復雜度為:
?
3.空間復雜度
空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度 。空間復雜度不是程序占用了多少bytes 的空間,因為這個也沒太大意義,所以空間復雜度算的是變量的個數。空間復雜度計算規則基本跟實踐復雜度 類似,也使用大O漸進表示法。
計算fibonacci(斐波那契)的空間復雜度?
int[] fibonacci(int n) {long[] fibArray = new long[n + 1];fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; i++) {fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray; }fibonacci(斐波那契)動態開辟了N個空間,空間復雜度為:
計算階乘遞歸Factorial的時間復雜度?
long factorial(int N) {return N < 2 ? N : factorial(N-1)*N; }階乘遞歸Factorial調用了N次,開辟了N個棧幀,每個棧幀使用了常數個空間。空間復雜度為:
總結
以上是生活随笔為你收集整理的时间复杂度以及空间复杂度(大O的渐进表示法)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: IWS国际儿童及青少年水彩画大赛开始了
- 下一篇: Android基础入门教程——9.2 M
