时间复杂度的计算

时间复杂度的定义:算法的时间复杂度是一个数学函数,定量的描述该算法的运行时间,一个算法的所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

作用:主要衡量的是一个算法的运行速度。

表示方式:大O的渐进表达式

推导大O阶的方法

1.用常数1取代运行时间中的所有加法常数,例子如下:

F(N)=3*N^2+2*N+10 => F(N)=3*N^2+2*N+1

2.在修改后的运行次数中,只保留最高阶项,例子如下:

F(N)=3*N^2+2*N+1 => F(N)=3*N^2

3.如果最高阶项存在且不是1,则去除与之这个项数相乘的常数,得到的结果就是大O阶了,例子如下:

F(N)=3*N^2 =>F(N)=N^2

使用大O渐进表示法以后F(N)=3*N^2+2*N+10=>O(N^2)

推荐初学者阅读大话数据这本书!!!

例子1

    void func1(int N) {
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                count++;
            }
        }
        for (int k = 0; k < 2 * N; k++) {
            count++;
        }
        int M = 10;
        while ((M--) > 0) {
            count++;
        }
    }
    /*
     *func1基本操作执行了F(N) = N^2 + 2*N + 10
     *时间复杂度:O(N^2)
     **/

例子2

 
    void func2(int N) {
        int count = 0;
        for (int k = 0; k < 2 * N; k++) {
            count++;
        }
        int M = 10;
        while ((M--) > 0) {
            count++;
        }

        System.out.println(count);
    }
     /*
     *func2的时间复杂度: O(N)
     * */

例子3

    void func3(int N, int M) {
        int count = 0;
        for (int k = 0; k < M; k++) {
            count++;
        }
        for (int k = 0; k < N; k++) {
            count++;
        }
        System.out.println(count);
    }
    /*
     * func3的时间复杂度:O(M+N)
     * */

例子4

   int binarySearch(int[] array, int value) {
        int begin = 0;
        int end = array.length - 1;
        while (begin <= end) {
            int mid = begin + ((end - begin) / 2);
            if (array[mid] < value)
                begin = mid + 1;
            else if (array[mid] > value)
                end = mid - 1;
            else
                return mid;
        }
        return -1;
    }
    /*binarySearch的时间复杂度:
     * O(logN)
     **/

例子5

    /*
     *计算阶乘递归factorial的时间复杂度:
     *O(N)
     *递归的时间复杂度=>递归的次数*每次递归后代码的执行次数
     *                    N            1 
     **/
    long factorial(int N) {
        return N < 2 ? N : factorial(N - 1) * N;
    }

例子6

   /*
    * 计算斐波那契递归fibonacci的时间复杂度:
    * O(2^N)
    * */
    int fibonacci(int N){
        return N < 2 ? N:fibonacci(N-1)+fibonacci(N-2);
    }

算法时间复杂度是衡量算法执行时间与输入数据量之间关系的一个量度。它通常用大O符号(O-notation)来表示,用于描述算法运行时间的增长率。以下是一些基本概念和计算方法: 1. 基本操作:在算法中,执行时间主要由基本操作的执行次数决定,基本操作通常是算法中最简单的计算步骤。 2. 最坏情况分析:时间复杂度通常针对最坏的情况来分析,即输入数据最不利于算法性能的场景。 3. 大O表示法:大O符号用于表示上界,它忽略低阶项和常数系数。例如,如果一个算法的执行次数为3n² + 2n + 1,其时间复杂度表示为O(n²)。 4. 常见的时间复杂度: - O(1):常数时间复杂度,表示算法的执行时间不随输入数据的大小变化而变化。 - O(log n):对数时间复杂度,常见于使用二分查找的算法。 - O(n):线性时间复杂度,表示算法执行时间与输入数据量成正比。 - O(n log n):线性对数时间复杂度,常见于一些高效的排序算法,如快速排序和归并排序。 - O(n²):平方时间复杂度,常见于简单的嵌套循环结构。 - O(2^n):指数时间复杂度,这类算法随着数据量的增加而迅速变得非常慢。 5. 主定理(Master Theorem):用于解决递归式的时间复杂度计算问题,适用于分治算法中的递归运行时间分析。 计算时间复杂度时,需要确定算法中的主导循环,并分析该循环中基本操作的执行次数如何随输入数据量n的增长而增长。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值