时间复杂度是个啥?

Java 找出匹配弱密码的数据 java判断密码复杂度_Java 找出匹配弱密码的数据

参考答案

1、时间复杂度是什么?

通俗来讲,时间复杂度是用来衡量算法的一个指标(就好比我们会用学历去衡量一个人一样)。

对于算法的好坏,是有多个指标的,时间复杂度只不过是其中之一(衡量一个人优秀与否,除了学历也还有其他的参考点,不是么?)。

2、如何表示时间复杂度?大O表示法

若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称为O(f(n)),O为算法的渐进时间复杂度,简称为时间复杂度。因为渐进时间复杂度用大写O来表示,所以也被称为大O表示法。

一脸懵逼是不是!!其实没必要去纠结它的概念性问题,你只需知道大O表示法的形式就是 O(n)。

3、如何计算时间复杂度?

按照下面的规则去计算时间复杂度

  • 1. 如果运行时间是常数量级,则用常数1表示
  • 2. 只保留时间函数中的最高阶项
  • 3. 如果最高阶项存在,则省去最高阶项前面的系数

4、来两个例子看看

约定,在方法体内,每执行一次操作,我们记作 1 个时间单位。

先看个简单的示例:

public static int test1 (int n) {
        n = + 2;
        return n++;
    }

分析:代码 n = + 2; 执行一次,花费1个时间单位;代码 return n++; 执行一次,花费1个时间单位,一共就是 1 + 1 = 2,根据规则1,该方法的时间复杂度就是 O(1)。

再来一个示例:

public static int test2 (int n) {
        int sum = 0;
        // 循环 n + 1 次
        for (int i = 0; i < n; i++) {
            // 第 i 趟的时候,循环 n - i + 1 次
            for (int j = 0; j < n - i; j++) {
                // 代码块花费的时间单位 n + (n-1) + (n-2) + (n-3) + … + 1 = n*(n-1)/2
                sum = + n;
            }
        }
        return sum;
    }

参考注释,所以test1( ) 的时间时间复杂度为 n*(n-1)/2,参考规则,结果为 O(n^2)。

留个题目,练练手

//冒泡排序  升序
    public static int[] bubbleSort (int[] arr) {
        if (arr.length == 0) {
            return arr;
        }
        //需要循环走访的次数
        for (int i = 0; i < arr.length; i++) {
            boolean isOrder = true;
            //进行相邻元素的比较循环:从第一组到最后一组
            for (int j = 0; j < arr.length - i - 1; j++) {
                //如果前一个元素比后一个元素大,就交换位置,将较大的数后移
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    isOrder = false;
                }
            }
            if (isOrder) {
                return arr;
            }
        }
        return arr;
    }

那么,冒泡排序的最优时间复杂度和最坏时间复杂度分别是多少呢?