首页 > 编程语言 >《Java初阶数据结构》----1.<时间复杂度&空间复杂度计算>

《Java初阶数据结构》----1.<时间复杂度&空间复杂度计算>

时间:2024-07-22 22:56:30浏览次数:17  
标签:count 初阶 Java 递归 int 复杂度 ++ 时间

目录

算法效率:

一、时间复杂度的计算

1.1时间复杂度的表示

1.2常见时间复杂度大小排序 

1.3计算示例

冒泡排序的时间复杂度

二分查找的时间复杂度

 阶乘递归factorial的时间复杂度

斐波那契递归的时间复杂度

二、空间复杂度的计算

冒泡排序的空间复杂度

计算fibonacci的空间复杂度 

计算阶乘递归Factorial的空间复杂度 


 

本篇博客主要讲解时间复杂度&空间复杂度计算。

一、时间复杂度

时间复杂度的表示

常见时间复杂度大小排序  

冒泡排序的时间复杂度

二分查找的时间复杂度

阶乘递归factorial的时间复杂度

斐波那契递归的时间复杂度

二、空间复杂度的计算

冒泡排序的空间复杂度

计算fibonacci的空间复杂度

计算阶乘递归Factorial的空间复杂度

算法效率:

算法效率分析分两种:

第一种是时间效率(时间复杂度):时间复杂度主要衡量的是一个算法的运行速度,算法中基本操作的执行次数,为算法的时间复杂度

第二种是空间效率(空间复杂度):衡量一个算法所需要的额外空间

一、时间复杂度的计算

算法中基本操作的执行次数,为算法的时间复杂度

1.1时间复杂度的表示

时间复杂度使用大O的渐进表示法

(1).用常数1取代运行时间中的所有加法常数。

(2).在修改后的运行次数函数中,只保留最高阶项。

(3).如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

1.2常见时间复杂度大小排序 

O(1) < O(logN) < O(N) < (N*logN) < O(N^2)

有些算法的时间复杂度存在

最好、平均和最坏情况: 最坏情况:

例如:在一个长度为N数组中搜索一个数据x

最好情况:1次找到

最坏情况:N次找到

平均情况:N/2次找到

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

1.3计算示例

示例1:

// 请计算一下func1基本操作执行了多少次?
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++;
   }
 
    System.out.println(count);
}

Func1 执行的基本操作次数 :

F(N)=N^2+2N+10 

使用大O的渐进表示法

Func1的时间复杂度为:O(N^2)

示例2:

// 计算func2的时间复杂度?
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);
}

 准确的执行次数是2N+10

使用大O的渐进表示法:O(N) 

示例3: 

// 计算func3的时间复杂度?
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);
}

 使用大O的渐进表示法:O(N+M) 

若题目条件M远大于N,则时间复杂度为O(M)

若题目条件M和N差不多大,则时间复杂度为O(M)或O(N)

// 计算func4的时间复杂度?
void func4(int N) {
    int count = 0;
 
    for (int k = 0; k < 100; k++) {
        count++;
   }
 
    System.out.println(count);
}

是100吗?

用常数1取代运行时间中的所有加法常数。

 因此,时间复杂度为O(1)

执行次数是常数次,并不是一次,可能是100,1000,10000....

若是有N,随N大,无限大,若是常数,它随N不变。。。

冒泡排序的时间复杂度

// 计算bubbleSort的时间复杂度?
void bubbleSort(int[] array) {
    for (int end = array.length; end > 0; end--) {
        boolean sorted = true;
        for (int i = 1; i < end; i++) {
            if (array[i - 1] > array[i]) {
                Swap(array, i - 1, i);
                sorted = false;
           }
       }
 
        if (sorted == true) {
            break;
       }
   }
}

冒泡排序如果从小到大排序,如果前一个大于后一个,就交换

时间复杂度:O(N^2) 

不是说一个循环就是O(N),两层循环就是O(N^2),具体要看程序

二分查找的时间复杂度

// 计算binarySearch的时间复杂度?
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;
}

最坏情况:假设找了X次

1*2*2*2*....*2=N(数组长度),找多少次乘多少次2

2^X=N

X=log以2为底N的对数,算法的复杂度计算时,经常喜欢省略简写成logN,把2省略了

是在算法里面简写:O(logN):取最坏情况则时间复杂度为O(logN)

有些书本或者网上资料会写成O(lgN)严格来说这样是不对的,这样也是2为底的

 阶乘递归factorial的时间复杂度

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
 return N < 2 ? N : factorial(N-1) * N;
}

递归,函数调用了N次,每次递归计算了O(1)次,因此

时间复杂度:O(N)

如果套了循环,i<n,则时间复杂度是:O(N^2)

递归的复杂度 = 递归的次数 * 每次递归的执行次数

斐波那契递归的时间复杂度

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

 

时间复杂度:O(2^N)

二、空间复杂度的计算

冒泡排序的空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。

空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。

空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

// 计算bubbleSort的空间复杂度?
void bubbleSort(int[] array) {
    for (int end = array.length; end > 0; end--) {
        boolean sorted = true;
        for (int i = 1; i < end; i++) {
            if (array[i - 1] > array[i]) {
                Swap(array, i - 1, i);
                sorted = false;
           }
       }
 
        if (sorted == true) {
            break;
       }
    }
}

使用了常数个额外空间,所以

空间复杂度为 O(1)  


计算fibonacci的空间复杂度 

// 计算fibonacci的空间复杂度?
int[] fibonacci(int n) {
    long[] fibArray = new long[n + 1];
    fibArray[0] = 0;
    fibArray[1] = 1;
    for (int i = 2; i <= n ; i++) {
    fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
   }
 
    return fibArray;
}

动态开辟了N个空间,

空间复杂度为 O(N)  


计算阶乘递归Factorial的空间复杂度 

// 计算阶乘递归Factorial的空间复杂度?
long factorial(int N) {
 return N < 2 ? N : factorial(N-1)*N;
}

递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。

空间复杂度为O(N)

标签:count,初阶,Java,递归,int,复杂度,++,时间
From: https://blog.csdn.net/m0_73456341/article/details/130070243

相关文章

  • Java学习——多线程
    1.多线程介绍1.1什么是多线程具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。1.2并发与并行并行:在同一时刻,有多个指令在多个CPU上同时执行。并发:在同一时刻,有多个指令在单个CPU上交替执行。高并发是什么意思:cpu2核4线程表示可并行处理4......
  • 如何理解JAVA的编码格式是Unicode
    背景今天看以前的JAVA视频,发现课件里面写着JAVA的内部的编码格式是Unicode。这句话,突然勾起了我的好奇心。因为的JAVA代码文件都是UTF8编码,怎么跟Unicode扯上关系的呢?我去问了一下AI,然后整理了一下Unicode是JAVA编译器的读取class文件使用的编码假设,我的如下代码是UTF-8编......
  • java-cglib动态代理原理
    cglib使用1.引入依赖<!--添加cglib依赖--><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>&......
  • java编程 2
    1,比较运算符,比g和103是否相等???代码:publicclassbj{   publicstaticvoidmain(String[]args){       charq='g';       intw=103;       if(q==103){   System.out.println("g和103是相等的");       }else{......
  • Java编程 3
    1.轿车平均加速度   =速度的变化量/时间的变化量   轿车用了8.7秒从0千米加速到每小时100千米代码:publicclassvp{   publicstaticvoidmain(String[]args){   ints0=0;//定义变量值   ints1=(int)100.11;//浮点型强制转化成整型  ......
  • 时间和空间复杂度
    目录 一、时间复杂度 1.1定义1.2分类二、空间复杂度 2.1定义 2.2分类 2.3重要性 在计算机科学中,算法的效率是一个至关重要的概念。评估算法的效率通常涉及两个主要方面:时间复杂度和空间复杂度。这两个概念不仅帮助我们理解算法在处理数据时的表现,还为开......
  • 使用Java和Flyway进行数据库版本控制
    使用Java和Flyway进行数据库版本控制大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们来深入探讨如何使用Java和Flyway进行数据库版本控制。一、Flyway简介Flyway是一个数据库迁移工具,它能够帮助开发者管理数据库版本,自动应用数据库迁移脚本,确保......
  • Java中的元编程与动态代理技术
    Java中的元编程与动态代理技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨Java中的元编程与动态代理技术。这些技术使得Java开发者能够在运行时动态地生成、修改代码或行为,增强了代码的灵活性和扩展性。一、元编程概述元编程(Metaprogr......
  • 使用Java和Spring Retry实现重试机制
    使用Java和SpringRetry实现重试机制大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在Java中使用SpringRetry来实现重试机制。重试机制在处理临时性故障和提高系统稳定性方面非常有用。一、SpringRetry简介SpringRetry是Spring框......
  • Java中的虚拟线程与并发编程优化
    Java中的虚拟线程与并发编程优化大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的虚拟线程及其对并发编程的优化。虚拟线程是Java21引入的一个新特性,它可以显著提高应用的并发性能,并简化线程的管理。我们将介绍虚拟线程的基本概......