时空复杂度

简介: 时空复杂度

一、算法效率

算法效率分为时间效率和空间效率。

时间效率

时间复杂度,衡量一个算法的运行速度。

空间效率

空间复杂度,衡量一个算法所需要的额外空间。

二、时间复杂度

概念

算法的时间复杂度是一个数学函数,描述了该算法的运行时间。一个算

法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

大O的渐进表示法

1、演示

void f1(int n){
        int count =0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {//N^2
                count++;
            }
        }
        for (int k = 0; k < 2*n; k++) {//2N
            count++;
        }
        int m=10;
        while((m--)>0){//10
            count++;
        }
        System.out.println(count);
    }

f1执行的基本操作次数:F(N)=N^2+2N+10

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

2、推导大O阶方法

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

F(N)=N^2+2N

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

F(N)=N^2

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

F(N)=N^2

使用大O的渐进表示法后可得到f1的时间复杂度为:O(N^2)

大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

有些算法的时间复杂度存在最好、平均和最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次

最好情况:任意输入规模的最小运行次数(下界)

在实际中一般情况关注的是算法的最坏运行情况。

3、常见的时间复杂度

O(1) < O(log2N) < O(N) < O(Nlog2N) < O(N^2)

void f2(int n){
        int count=0;
        for (int i = 0; i < 100; i++) {//O(1)
            count++;
        }
        System.out.println(count);
    }
int binarySearch(int[] array,int value){//二分查找
        int begin=0;
        int end=array.length-1;
        while(begin<=end){//O(log2N)
            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;
    }

结合二分查找思想

数据个数 次数
2 2
4 3
8 4
N X

执行次数:X=log2N+1

时间复杂度:O(log2N)

long factorial(int n){
        //递归   递归的次数*每次递归后代码的执行次数
        //N*1
        //O(N)
        return n<2?n:factorial(n-1)*n;
    }

三、空间复杂度

概念

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法

实例

void bubbleSort(int[] array){
        for(int end=array.length;end>0;end--){
            boolean sorted=true;//问题的规模:n个数据
            //sorted 空间复杂度 O(1)
            for(int i=1;i<end;i++){
                if(array[i-1]>array[i]){
                    Swap(array,i-1,i);
                    sorted=false;
                }
            }
            if(sorted==true){
                break;
            }
        }
    }
long[] 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];//O(N)
        }
        return fibArray;
    }
long factorial(int N){
        return N<2?N:factorial(N-1)*N;//O(N)
    }

目录
相关文章
|
7月前
|
机器学习/深度学习 存储 算法
如何评判算法好坏?复杂度深度解析
如何评判算法好坏?复杂度深度解析
125 0
|
2月前
|
机器学习/深度学习 自然语言处理 算法
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
本文探讨了通过多模型集成技术提升信息检索系统性能的方法,重点介绍了RAPTOR框架。RAPTOR通过构建层次化的信息组织结构和递归摘要技术,显著提高了检索系统的性能和适应性。研究建立在RAG Fusion技术基础上,旨在提供更全面的信息检索解决方案。
179 2
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
|
1月前
|
监控
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
通过引入稀疏化和角色多样性,SMoA为大语言模型多代理系统的发展开辟了新的方向。
44 6
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
|
7月前
|
存储 并行计算 算法
【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)
【深度挖掘Java性能调优】「底层技术原理体系」深入挖掘和分析如何提升服务的性能以及执行效率(性能三大定律)
89 0
|
5月前
|
机器学习/深度学习 搜索推荐 知识图谱
图神经网络加持,突破传统推荐系统局限!北大港大联合提出SelfGNN:有效降低信息过载与数据噪声影响
【7月更文挑战第22天】北大港大联手打造SelfGNN,一种结合图神经网络与自监督学习的推荐系统,专攻信息过载及数据噪声难题。SelfGNN通过短期图捕获实时用户兴趣,利用自增强学习提升模型鲁棒性,实现多时间尺度动态行为建模,大幅优化推荐准确度与时效性。经四大真实数据集测试,SelfGNN在准确性和抗噪能力上超越现有模型。尽管如此,高计算复杂度及对图构建质量的依赖仍是待克服挑战。[详细论文](https://arxiv.org/abs/2405.20878)。
88 5
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
|
7月前
|
机器学习/深度学习 数据可视化 算法
R语言贝叶斯广义线性混合(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据
R语言贝叶斯广义线性混合(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据
|
7月前
|
机器学习/深度学习 监控 自动驾驶
新视频分析技术TDViT发布:提升稠密视频分析效率
【2月更文挑战第16天】新视频分析技术TDViT发布:提升稠密视频分析效率
114 1
新视频分析技术TDViT发布:提升稠密视频分析效率
|
Web App开发 调度 Windows
开源代码分享(8)—大规模电动汽车时空耦合双层优化调度(附matlab代码)
本文研究了发电机、电动汽车和风能的协同优化调度问题。提出了一种新颖的双层优化方法,用于解决在风能存在的情况下,电动汽车充放电负荷在时间和空间领域的调度问题。在输电系统中,上层优化协调了电动汽车、热发电机和基本负荷,考虑了风能因素,优化了电动汽车在时间域内的负荷时段。在配电系统中,下层优化则对电动汽车负荷的位置进行空间调度。通过对一个拥有10台发电机的输电网和一个IEEE 33节点的配电网的电力系统基准进行评估,评估了提出的双层优化策略的性能。分析了电价曲线、电动汽车普及率以及电动汽车负荷位置等因素的影响。
|
存储 算法
时空复杂度详解
我们写出来了一个算法,但是这个算法怎么样呢?