【Java 面试题系列 06】时间复杂度是个啥?

 点击上方“方才编程”,每天进步一点点!

决定每天上午8点整,分享一道 Java 面试题。厚积薄发,每天进步一点点!

【第 6 天】题目

时间复杂度是个啥?


参考答案

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;
    }

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

留言区

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Java数据结构面试题通常涉及到数组和ArrayList的使用,以及对数组的操作和判断。以下是一些常见的Java数据结构面试题及答案: 1. 如何判断数组是null还是为空? 可以使用数组的length属性来判断。如果数组为null,那么length属性会抛出NullPointerException异常;如果数组为空,即长度为0,那么length属性的值为0。 2. 如何打印数组? 可以使用Arrays类的toString()方法来打印数组。例如,使用System.out.println(Arrays.toString(array))可以打印出数组的内容。 3. 如何打印数组中的重复元素? 可以使用两层循环来遍历数组,比较每个元素与其他元素是否相等。如果相等,则表示有重复元素。 4. Array和ArrayList有什么区别?什么时候应该使用Array而不是ArrayList? Array是一个固定长度的数据结构,一旦创建后长度不可改变。ArrayList是一个可变长度的数据结构,可以动态添加和删除元素。当需要一个固定长度的数据结构时,可以使用Array;当需要一个可变长度的数据结构时,可以使用ArrayList。 5. 数组和链表数据结构描述,各自的时间复杂度? 数组是一种线性数据结构,元素在内存中是连续存储的。访问元素的时间复杂度为O(1),插入和删除元素的时间复杂度为O(n)。 链表是一种非连续的数据结构,元素在内存中是通过指针连接的。访问元素的时间复杂度为O(n),插入和删除元素的时间复杂度为O(1)。 6. 数组有没有length()这个方法? String有没有length()这个方法? 数组没有length()方法,而是使用length属性来获取数组的长度。 String有length()方法,可以返回字符串的长度。 希望以上回答对您的面试准备有所帮助。如果您需要更详细的答案和更多面试题,可以参考引用[1]和引用[2]中提到的文档和视频资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值