时空复杂度

简介: 时空复杂度

一、算法效率

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

时间效率

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

空间效率

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

二、时间复杂度

概念

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

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

大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)
    }

目录
相关文章
|
2月前
|
机器学习/深度学习 自然语言处理 算法
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
本文探讨了通过多模型集成技术提升信息检索系统性能的方法,重点介绍了RAPTOR框架。RAPTOR通过构建层次化的信息组织结构和递归摘要技术,显著提高了检索系统的性能和适应性。研究建立在RAG Fusion技术基础上,旨在提供更全面的信息检索解决方案。
186 2
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
|
1月前
|
机器学习/深度学习 PyTorch API
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
Transformer架构自2017年被Vaswani等人提出以来,凭借其核心的注意力机制,已成为AI领域的重大突破。该机制允许模型根据任务需求灵活聚焦于输入的不同部分,极大地增强了对复杂语言和结构的理解能力。起初主要应用于自然语言处理,Transformer迅速扩展至语音识别、计算机视觉等多领域,展现出强大的跨学科应用潜力。然而,随着模型规模的增长,注意力层的高计算复杂度成为发展瓶颈。为此,本文探讨了在PyTorch生态系统中优化注意力层的各种技术,
63 6
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
【分布鲁棒】多源动态最优潮流的分布鲁棒优化方法
|
7月前
|
机器学习/深度学习 监控 自动驾驶
新视频分析技术TDViT发布:提升稠密视频分析效率
【2月更文挑战第16天】新视频分析技术TDViT发布:提升稠密视频分析效率
115 1
新视频分析技术TDViT发布:提升稠密视频分析效率
带你读《5G大规模天线增强技术》——2.4.8 小尺度计算增强(2)
带你读《5G大规模天线增强技术》——2.4.8 小尺度计算增强(2)
带你读《5G大规模天线增强技术》——2.4.8 小尺度计算增强(2)
|
存储 算法
时空复杂度详解
我们写出来了一个算法,但是这个算法怎么样呢?
|
Web App开发 调度 Windows
开源代码分享(8)—大规模电动汽车时空耦合双层优化调度(附matlab代码)
本文研究了发电机、电动汽车和风能的协同优化调度问题。提出了一种新颖的双层优化方法,用于解决在风能存在的情况下,电动汽车充放电负荷在时间和空间领域的调度问题。在输电系统中,上层优化协调了电动汽车、热发电机和基本负荷,考虑了风能因素,优化了电动汽车在时间域内的负荷时段。在配电系统中,下层优化则对电动汽车负荷的位置进行空间调度。通过对一个拥有10台发电机的输电网和一个IEEE 33节点的配电网的电力系统基准进行评估,评估了提出的双层优化策略的性能。分析了电价曲线、电动汽车普及率以及电动汽车负荷位置等因素的影响。
|
存储 数据挖掘 调度
基于双层优化的大型电动汽车时空调度(Matlab代码实现)
基于双层优化的大型电动汽车时空调度(Matlab代码实现)
125 0
|
5G 定位技术 Windows
带你读《5G大规模天线增强技术》——2.4.8 小尺度计算增强(1)
带你读《5G大规模天线增强技术》——2.4.8 小尺度计算增强(1)
|
存储 算法 Java
如何简单理解集合框架和利用时空复杂度?
如何简单理解集合框架和利用时空复杂度?