- 时间复杂度为一个算法流程中, 常数操作数量的指标。 常用O(读作big O) 来表示。 具体来说, 在常数操作数量的表达式中,
只要高阶项, 不要低阶项, 也不要高阶项的系数, 剩下的部分如果记为f(N), 那么时间复杂度为O(f(N))。 - (例一)一个简单的理解时间复杂度的例子一个有序数组A, 另一个无序数组B, 请打印B中的所有不在A中的数, A数组长度为N, B数组长度为M。
算法流程1: 对于数组B中的每一个数, 都在A中通过遍历的方式找一下;
算法流程2: 对于数组B中的每一个数, 都在A中通过二分的方式找一下;
算法流程3: 先把数组B排序, 然后用类似外排的方式打印所有在A中出现的数;
三个流程, 三种时间复杂度的表达...
算法流程1所需要的时间复杂度为O(M*N) 算法流程2 二分的方式:首先将数组遍历,然后取中间数跟要取的数比较,依次进行。需要的次数为 log2N。时间复杂度为O( log2N),总共时间复杂度为O(M*log2N)。 算法流程3 外排 将两个有序数组依次比较,谁小动哪个数组,直到两数组相等打印。排序时间复杂度为O(N*log2N),第二步比较时间复杂度O(N+M),总的时间复杂度为:O(N*log2N)+O(N+M) 根据样本量来化简。
比较:算法流程1直接排除,算法流程2和算法流程3确定N、M数据量来比较。 - 冒泡排序:从第一个数,相邻两个数比较大小,若前一个数比后一个数大就交换,依次进行,排到最后,最大的数在最右端。继续从一个开始,排到N-1位置,依次类推。
public static void bubbleSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int e = arr.length - 1; e > 0; e--) { for (int i = 0; i < e; i++) { if (arr[i] > arr[i + 1]) { swap(arr, i, i + 1); } } }
时间复杂度为O(N2)
- 选择排序:从数组中选择最小的数放在第一位置,然后在剩下的数中选择最小得数放在第二位置,以此类推。
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) { return; } for (int i = 0; i < arr.length - 1; i++) { int minIndex = i; for (int j = i + 1; j < arr.length; j++) { minIndex = arr[j] < arr[minIndex] ? j : minIndex; } swap(arr, i, minIndex); }时间复杂度为O(N2)
- 插入排序:0位置数确定,1位置与0位置上数比较,如果小就交换,2位置上数与1位置上数比较,若小就交换,然后在与0位置上的数比较大小,以此类推。类似抓扑克牌。
public static void insertionSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int i = 1; i < arr.length; i++) { for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { swap(arr, j, j + 1); } }
与数据状况有关系,若排好序时间复杂度为O(N),若是逆序则时间复杂度为O(N2)。
- 对数器的概念和使用
0) 有一个你想要测的方法a
1)实现一个绝对正确但是复杂度不好的方法b
2)实现一个随机样本产生器
3)实现比对的方法
4)把方法a和方法b比对很多次来验证方法a是否正确
5)如果有一个样本使得比对出错, 打印样本分析是哪个方法出错
6)当样本数量很多时比对测试依然正确, 可以确定方法a已经正确
// for test 随机数发生器 public static int[] generateRandomArray(int maxSize, int maxValue) { int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); //产生正负值 } return arr; } //Math.random() ->double [0,1) //(int)((size + 1)*Math.random()) ->[0,size]
- 完整代码
1 package basic_class_01; 2 3 import java.util.Arrays; 4 5 public class Code_01_InsertionSort { 6 7 public static void insertionSort(int[] arr) { 8 if (arr == null || arr.length < 2) { 9 return; 10 } 11 for (int i = 1; i < arr.length; i++) { 12 for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { 13 swap(arr, j, j + 1); 14 } 15 } 16 } 17 18 public static void swap(int[] arr, int i, int j) { 19 arr[i] = arr[i] ^ arr[j]; 20 arr[j] = arr[i] ^ arr[j]; 21 arr[i] = arr[i] ^ arr[j]; 22 } 23 24 // for test 25 public static void comparator(int[] arr) { 26 Arrays.sort(arr); 27 } 28 29 // for test 30 public static int[] generateRandomArray(int maxSize, int maxValue) { 31 int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; 32 for (int i = 0; i < arr.length; i++) { 33 arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); 34 } 35 return arr; 36 } 37 38 // for test 39 public static int[] copyArray(int[] arr) { 40 if (arr == null) { 41 return null; 42 } 43 int[] res = new int[arr.length]; 44 for (int i = 0; i < arr.length; i++) { 45 res[i] = arr[i]; 46 } 47 return res; 48 } 49 50 // for test 51 public static boolean isEqual(int[] arr1, int[] arr2) { 52 if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) { 53 return false; 54 } 55 if (arr1 == null && arr2 == null) { 56 return true; 57 } 58 if (arr1.length != arr2.length) { 59 return false; 60 } 61 for (int i = 0; i < arr1.length; i++) { 62 if (arr1[i] != arr2[i]) { 63 return false; 64 } 65 } 66 return true; 67 } 68 69 // for test 70 public static void printArray(int[] arr) { 71 if (arr == null) { 72 return; 73 } 74 for (int i = 0; i < arr.length; i++) { 75 System.out.print(arr[i] + " "); 76 } 77 System.out.println(); 78 } 79 80 // for test 81 public static void main(String[] args) { 82 int testTime = 500000; 83 int maxSize = 100; 84 int maxValue = 100; 85 boolean succeed = true; 86 for (int i = 0; i < testTime; i++) { 87 int[] arr1 = generateRandomArray(maxSize, maxValue); 88 int[] arr2 = copyArray(arr1); 89 insertionSort(arr1); 90 comparator(arr2); 91 if (!isEqual(arr1, arr2)) { 92 succeed = false; 93 break; 94 } 95 } 96 System.out.println(succeed ? "Nice!" : "Fucking fucked!"); 97 98 int[] arr = generateRandomArray(maxSize, maxValue); 99 printArray(arr); 100 insertionSort(arr); 101 printArray(arr); 102 } 103 104 }