o(1), o(n), o(logn), o(nlogn)是用來表示對應算法的時間復雜度,這是算法的時間復雜度的表示。不僅僅用於表示時間復雜度,也用於表示空間復雜度。
算法復雜度分為時間復雜度和空間復雜度。其作用:
時間復雜度是指執行這個算法所需要的計算工作量;
空間復雜度是指執行這個算法所需要的內存空間;
時間和空間都是計算機資源的重要體現,而算法的復雜性就是體現在運行該算法時的計算機所需的資源多少;
O后面的括號中有一個函數,指明某個算法的耗時/耗空間與數據增長量之間的關系。其中的n代表輸入數據的量。
時間復雜度為O(n)—線性階,就代表數據量增大幾倍,耗時也增大幾倍。比如常見的遍歷算法。
//循環遍歷N次即可得到結果

1 //循環遍歷N次即可得到結果 2 count = 0; 3 for(int i = 0;i < 10 ; i ++){ 4 count ++; 5 }
時間復雜度O(n^2)—平方階, 就代表數據量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間復雜度。比如冒泡排序,就是典型的O(n x n)的算法,對n個數排序,需要掃描n x n次。

1 for(int i =1;i<arr.length;i++) { //遍歷n次 2 for(int j=0;j<arr.length-i;j++) {//遍歷n-1次 3 if(arr[j]>arr[j+1]) { 4 int temp = arr[j]; 5 arr[j]=arr[j+1]; 6 arr[j+1]=temp; 7 } 8 } 9 } 10 //整體復雜度n*(n-1)
時間復雜度O(logn)—對數階,當數據增大n倍時,耗時增大logn倍(這里的log是以2為底的,比如,當數據增大256倍時,耗時只增大8倍,是比線性還要低的時間復雜度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256個數據中查找只要找8次就可以找到目標。

1 int binarySearch(int a[], int key) { 2 int low = 0; 3 int high = a.length - 1; 4 while (low <= high) { 5 int mid = low + (high - low) / 2; 6 if (a[mid] > key) 7 high = mid - 1; 8 else if (a[mid] < key) 9 low = mid + 1; 10 else 11 return mid; 12 } 13 return -1; 14 }
時間復雜度O(nlogn)—線性對數階,就是n乘以logn,當數據增大256倍時,耗時增大256*8=2048倍。這個復雜度高於線性低於平方。歸並排序就是O(nlogn)的時間復雜度。

1 public void mergeSort(int[] arr, int p, int q){ 2 if(p >= q) { 3 return 4 }; 5 int mid = (p+q)/2; 6 mergeSort(arr, p, mid); 7 mergeSort(arr, mid+1,q); 8 merge(arr, p, mid, q); 9 } 10 private void merge(int[] arr, int p, int mid, int q){ 11 int[] temp = new int[arr.length]; //此處將數組設為全局變量,否則每次都要創建一遍。 12 int i = p, j = mid+1,iter = p; 13 while(i <= mid && j <= q){ 14 if(arr[i] <= arr[j]) { 15 temp[iter++] = arr[i++]; 16 } else{ 17 temp[iter++] = arr[j++]; 18 } 19 } 20 21 while(i <= mid) { 22 temp[iter++] = arr[i++]; 23 } 24 25 while(j <= q){ 26 temp[iter++] = arr[j++]; 27 } 28 29 for(int t = p; t <= q; t++) { 30 arr[t] = temp[t]; 31 } 32 }
O(1)—常數階:最低的時空復雜度,也就是耗時與輸入數據大小無關,無論輸入數據增大多少倍,耗時/耗空間都不變。 哈希算法就是典型的O(1)時間復雜度,無論數據規模多大,都可以在一次計算后找到目標。

1 index = a; 2 a = b; 3 b = index; 4 //運行一次就可以得到結果
時間復雜度的優劣對比
常見的數量級大小:越小表示算法的執行時間頻度越短,則越優;
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)//2的n方<O(n!)<O(nn)//n的n方