数据结构与算法系列之<1>----复杂度

##数据结构与算法 01-复杂度分析

大O表示法

1.一般用大O表示法来描述复杂度,它表示的是数据规模n对应的复杂度

  • 忽略常数、系数、低阶
  • 999 ----> O(1)
  • 666n + 1999 —> O(n)
  • 99n^2 + 21n + 888 —>O(n^2)
  • 88n^3 + 77n^2 + 66n + 55 --> O(n^3)

1.1 对test1算法复杂度进行分析

public static void test1(int n) {
        if (n > 10) {
            System.out.println("n > 10");
        } else if (n > 5) {
            System.out.println("n > 5");
        } else {
            System.out.println("else");
        }
		//被执行1次

		//int i = 0; 被执行1次
		//i < 4; 被执行4次
		// i++  被执行4次
		//System.out.println("test");  被执行次数为4
        for (int i = 0; i < 4; i++) {
            System.out.println("test");
        }

		//总共被执行 1 + 1 + 4 + 4 + 4  == 14次
		//所以该方法的复杂度为O(1)
    }

1.2 对test2算法复杂度进行分析

public static void test2(int n) {
        //int i = 0; 被执行次数为1
        //i < n; 被执行次数为n
        //i++  被执行次数为n
        //System.out.println("test2");  被执行次数为n
        for (int i = 0; i < n; i++) {
           System.out.println("test2");
        }
        
        //总共被执行次数为 1 + n + n + n == 1 + 3n
        //所以该方法的复杂度为O(n)
    }

1.3 对test3算法复杂度进行分析

public static void test3(int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.println("test3");
            }
            
        }

        //int i = 0; 被执行次数为1
        //i < n;  被执行次数为 n
        // i++ 被执行次数为n

        //for (int j = 0; j < n; j++) {
        //   System.out.println("test3");
        //}  被执行次数为n

        //int j = 0; 被执行次数为1
        //j < n; 被执行次数为n
        //j++ 被执行次数为n
        //System.out.println("test3"); 被执行次数为n

        //则第一层嵌套内:总共被执行次数为
        // n * (1 + n + n + n)

        //那么总共被执行次数为
        //1 + n +n + n*(3n + 1)
        //即: 3n^2 + 3n + 1
        //那么复杂度为 O(n^2)
    }

1.4 对test4算法复杂度进行分析

public static void test4(int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 15; j++) {
                System.out.println("test5");
            }
        }

        //总共被执行次数
        //1 + n + n + n*(1 + 15 + 15 + 15)
        //1 + 48*n
        //复杂度为O(n)
    }

1.5 对test5算法复杂度进行分析

public static void test5(int n) {
        // 被执行次数
        // 当n = 8  2^3 = 8 执行3次
        // 当n = 16 2^4 = 16 执行4次
        // 所以执行 log2(n) 次

        // 因为在数学中  log2(n) = log2(N) * logN(n)
        // 所以 所有执行logN(n) 次的 复杂度 为 O(logn)
        while ((n = n / 2) > 0) {
            System.out.println("test5" + n);
        }
    }

1.6 对test6算法复杂度进行分析

 public static void test6(int n) {
        // 通过test5() 同理可得
        // 复杂度为O(logn)
        while ((n = n / 5) > 0) {
            System.out.println("test6");
        }
    }

1.7 对test7算法复杂度进行分析

public static void test7(int n) {
        // 被执行次数: 1 + n
        // i += i ==》 i = i * 2  即 i = i / 2  执行次数为 log2(n)
        // 内层被执行次数 也是log2(n)

        //内部被执行 1 + 3n 次
        //总共被执行次数  1 + n + log2(n) + log2(n) * (1 + 3n)
        //即等于 1 + n + 2log2(n) + 3nlog2(n)
        // 1 + n + (3n+2)log2(n)

        //所以复杂度为O(nlogn)
        for (int i = 0; i < n; i += i) {
            for (int j = 0; j < n; j++) {
                System.out.println("test7");
            }
        }
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值