时间复杂度

  1. 时间复杂度为一个算法流程中, 常数操作数量的指标。 常用O(读作big O) 来表示。 具体来说, 在常数操作数量的表达式中,
    只要高阶项, 不要低阶项, 也不要高阶项的系数, 剩下的部分如果记为f(N), 那么时间复杂度为O(f(N))。


  2. (例一)一个简单的理解时间复杂度的例子一个有序数组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数据量来比较。

  3. 冒泡排序:从第一个数,相邻两个数比较大小,若前一个数比后一个数大就交换,依次进行,排到最后,最大的数在最右端。继续从一个开始,排到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)

     

  4. 选择排序:从数组中选择最小的数放在第一位置,然后在剩下的数中选择最小得数放在第二位置,以此类推。
       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)

  5. 插入排序: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)。

  6. 对数器的概念和使用
    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]

  7. 完整代码
      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 }

     

posted @ 2018-07-17 16:30  lijun199309  阅读(213)  评论(0编辑  收藏  举报