时间复杂度分析

article/2025/11/11 7:12:05

该节知识点引用机械工业出版社数据结构和算法分析第2章内容

以及极客时间数据结构和算法部分知识点
在这里插入图片描述

时间复杂度基础分析

算法执行时间分析

时间复杂度分析更多的是对要编写的代码进行一个事前预估分析的一个过程,通过事前大致分析出算法执行的时间和所需要的空间(空间复杂度分析)从而在事前对代码进行调整优化,确保代码的质量。

与事前分析法对用的是事后分析法,事后分析法通过代码在执行后统计代码执行时间和所需要的的资源,但是该方法存在一个不确定性的问题,不同代码在不同配置的计算机上的执行时间可能会不尽相同,而最终得到的结论也是不同的,会存在偏差。

算法的执行效率大致的来说便是算法执行的时间,这里我们通过大O表示法来衡量算法的优劣,O越低的算法执行时间便越低,通常的时间量有O(1),O(n),log(n),O(n2),O(n3),等。在代码中一条语句的时间复杂度是O(1),那么是不是可以得到一个结论一个相同的代码执行n此(有限次)那么这条代码的时间复杂度便是O(n)。

O(1):一个常量级时间复杂度

int x=0;

O(n):线性级时间复杂度:

int sum=0;
for(int x=0;x<n;x++){sum +=1;
}

上述代码时间复杂度分析:我定义一个常量级时间复杂度为一个un_time,注意我们讨论的n是有限次的n。

  • 第一行代码:int sum = 0 执行了一次为1个un_time。

  • 第二行代码:for(int x=0;x<n;x++) x=0自增到n(不满足条件退出循环)一共执行n次拿就是n*un_time。

  • 第三行:sum +=1; 注意这里的执行次数是由for循环控制的,那么是不是可以认为我for循环执行了几次第三行就执行了几次,那么是不是就是n*un_time。

  • 现在我们把上述代码的时间复杂度相加便得到整个代码块的时间复杂度(定义为T(n))T(n)=un_time+nun_time+num_time = (2n+1)*un_time

O(n^2):平方级时间复杂度:

int sum = 0;
for(int x=0;x<n;x++){for(int y=0;y<n;y++){sum +=1;  }
}

上述代码时间复杂度分析:

  • 第一行代码:执行了一次花费了一个un_time。

  • 第二行代码:x从0变化到n执行了n次那就是 n*un_time。

  • 第三行代码:这里是重点(和第4行一起分析了)当x=0的时候执行n次,x=1执行n次,x=1时执行n次,x=2时执行n次,x=3时执行n次,那么是不是可以推断出当x=n时执行n*n次,4和4加起来就是(2n^2)*un_time次。

  • 那么总的时间复杂度就是 T(n) = un_time+n*un_time+(2n^2)*un_time = (2n^2+n+1)*un_time

下面对上述代码进行变形:这次我们尝试分析最后一句的语句进行频度

int sum = 0;
for(int x=1;x<=n;x++){for(int y=1;y<=x;y++){sum +=1;}}

对于上面的代码我们根据O(n2)的时间复杂度分析可以得到一个粗略的值是O(n2)(这里只是一个粗略的估算值,并不是精确值 但是为什么可以取O(n^)后面将会讨论),那么想在 提出的问题是不是计算他的总的时间复杂度而是分析第4行代码的语句执行频度(该行语句的层数是最深的所以执行次数也是最多的,他的执行次数加上2,3行的代码执行次数便是整个代码的精确执行次数)分析:

  • x=1 --> 1次

  • x=2 --> 2次

  • x=3 --> 3次

  • x=n -->n次

  • 可以推出 该语句的执行次数是一个等差数列 a1=1,d=1 通过下述公式计算得语句执行次数为S(n)= (n^2+n)/2;

我们再次对上式进行变形:再次分析sum=sum+1 表达式的语句执行频度

int sum = 0;
for(int x=0;x<=n;x++){for(int y=0;y<=x;y++){sum = sum+1;}
}

我们对上述代码进行分析:

  • x=0 --> 1

  • x=1 --> 2

  • x=2 --> 3

  • x=3 --> 4

  • x=n --> n+1

我们发现x的变化过程,影响着代码的执行次数 当x=0时代码执行一次,当x=1时代码执行2次那么当x=k(k != n)时代码执行k++次,那么我们将x每次变化的次数相加是不是就能够得到整个执行过程的执行次数,这里我们引用一个数学上的级数公式(下图),我们根据该公式进行求解:
在这里插入图片描述
在这里插入图片描述

通过对T(n) 的计算得到了sum +=1 的代码执行频度是(n+1)*(n+2)/2

O(n^3):立方级时间复杂度:

int sum = 0;
for(int x=0;x<n;x++){for(int y=0;x<n;y++){for(int k=0;k<n;k++){sum = sum+1; }  }
}

我们看到上述代码比平方阶多了一层for循环嵌套,通过对O(n2)的计算或许我们能够很快的就计算出T(n)=un_time+n*un_time+n2un_time+n3*un_time+n3un_time 对表达式进行整理:

我们再次对上述代码进行变形:请计算出sum=sum+1的语句执行频度

int sum = 0;
for(int x=1;x<=n;x++){for(int y=1;y<=x;y++){for(int k=1;k<=y;k++){sum = sum+1;}}
}

我们发现这个变形代码和上面的代码不同的是他的判断结束条件变了,我们尝试跟踪一下他的执行次数(这里我跟踪的是x的值,执行次数是sum=sum+1)

下面这个图片引用CSDN博客的图片:图片中的i是代码中的x ,j是代码中的y

https://blog.csdn.net/qq_37922264/article/details/103583387?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

在这里插入图片描述

  • x=1 --> 1

  • x=2 --> 3

  • x=3 --> 6

  • x=4 --> 10

  • x=i --> i(i+1)/2

根据上述推导可以得到级数公式:

在这里插入图片描述

对级数公式进行推导计算:

在这里插入图片描述

我们通过对线性阶,平方阶,立方阶,甚至是4次方阶我们计算其时间复杂度是预测计算取最大值(可以说是最坏情况),在我们精确计算出的数据中我们去其中 最大值最为这个算法的执行时间复杂度例如:三次方阶的标椎代码其时间复杂度我们可以估算为是O(n3),有一个问题我们为什么能够将算法的时间复杂度进行一个估算?在线性阶中一个O(1)相对于一个O(n)那么这个O(1)是不是非常的小,那么这个大O(1)我们是不是可以忽略不计(注意在排序中当一个常量级时间*一个log级时间的时间复杂度是不能进行忽略计算的),那么在O(n3)立方阶中我们是不是也可以取最大值作为整个代码块的时间复杂度。

这里有一点需要注意的是在常量阶中不论赋值语句有多少行,if,switch,等语句有多少都是按照一个O(1)来计算的,只要代码不随n的增长而增长这样的代码便可以记做O(1)

下面我们讨论一下对数(log)阶,对数阶相对于线性阶其算法执行效率,执行时间要更占优(但是个人觉得log阶的时间复杂度也是最难分析的)log阶默认的底都为2如有其它参数作为底请进行特殊标记。

O(logn):对数阶:

int x=1;
while(x<=n){x *= 2;
}

从代码中我们可以看出,变量x取值从1开始当x的值大于n时循环结束,那么当x=n 时第三行代码则执行最后一次,通过x的取值变化可以发现他是一个等比数列(2的指数值是该项前面有一个项),那么x的值是不是就是代码的执行次数,2^x = n --> x=logn

在这里插入图片描述

假设现在对x值得变化进行一个改变令 x *=3 那么执行次数是不是就变成了:‘’

在这里插入图片描述

那么他的时间复杂度是不是就是 T(n)= log3(n)

我们知道,对数之间是可以互相转换的,log3n 就等于 log32 * log2n,所以 O(log3n) = O(C * log2n),其中 C=log32 是一个常量。基于我们前面的一个理论:在采用大 O 标记复杂度的时候,可以忽略系数,即 O(Cf(n)) = O(f(n))。所以,O(log2n) 就等于 O(log3n)。因此,在对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为 O(logn)

2019年考研算法时间复杂度分析题解析:

题目:设 n 是描述问题规模的非负整数,下列程序段的时间复杂度

x=0while(n>=(x+1)*(x+1))
)x=x+l;

解析:代码中使用的是while循环所以我们需要观察x和(x+1)2的变化值和当(x+1)2何时等于n时程序第三行最后执行一次(当(x+1)2>n时程序结束),当找到(x+1)2的值等于n时,该项前面有几项就是程序的执行频度(时间复杂度):x --> (x+1)^2

  • 0 – > 1

  • 1 --> 4

  • 2 --> 9

  • 3 --> 16

  • 4 --> 25

  • 5 --> 36

  • n --> (n+1)^2

我们运用数学归纳法对数据值进行分析:当(x+1)2=4时程序执行了2此,当(x+1)2=9时程序执行了3次,当(x+1)2=5时程序执行了6次,由此我们是不是暂时得到一个结论当我们(x+1)2的值取根号计算得到代码执行次数,由数学推论法中的特殊性得到普遍性,对(x+1)^进行去根号计算可以得 到代码执行次数,应为(x+1)^2等于n所以可以得出算法执行的时间复杂度为:

加法法则

加法法则:总的时间复杂度等于量级最大那段代码的时间复杂度

//代码片段一
int sum1 = 0;
for(int x=0;x<1000;x++){sum1 +=1; 
}//代码片段二
int sum2 = 0;
for(int x=0;x<n;x++){sum2 += 1;
}//代码片段三
int sum3 = 0;
for(int x=0;x<n;x++){for(int y=0;y<n;y++){sum +=1;}
}

现在我们是不是能够很快的计算出整个代码块的时间复杂度?代码片段一:O(1),代码片段二:O(n),代码片段三:O(n^2),这里有点需要注意的是代码片段一中的代码循环个了1000次是一个常量级执行时间和n没有关系所以时间复杂度是O(1),这里再次强调一下即使代码片段循环执行10000次,20000次他都是一个常量级时间跟n没有关系,n是一个变化的值他可能是100000或者是1000或者是一个无限大的值当n的值越大的时候对算法的执行时间影响就越大,当我们回到时间复杂度分析的概念来说他分析的是算法的执行效率和数据规模之间的关系,其中体现的是数据规模的变化对算法执行效率的影响而常量值是确定的值,所以在计算算法时间复杂度是O(1)常量级时间复杂度可以忽略不计。

现在我们将上述三个代码段的时间复杂度抽象为公式:

我们对上述公式运用加法法则进行计算:

结论:算法总的时间复杂度等于量级最大的那段代码的时间复杂度。

乘法法则

乘法法则:嵌套代码的复杂度等于嵌套内外层代码复杂度的乘积

//代码片段一
int cal(int n){int sum = 0;for(int x=0;x<n;x++){sum += f(x);       }
}//代码片段二
int f(int n){int fel = 0;for(int x=0;x<=n;x++){fel +=x;}return fel;
}

现在我们能够很快分析出代码片段一和代码片段二的算法执行的时间复杂度:T1(n) = O(n) ;T2(n) = O(n) ,现在我们假设T1(n) = G(n),T2(n) = C(n),由乘法法则我们可以得到以下的抽象公式:

由上述公式我们可以得到上述算法执行的时间复杂的是O(n^2),当我们在计算多个函数的嵌套的时间复杂度时需要一层一层 去解析函数,不能以一个常量的时间复杂度去计算。

总结:嵌套代码的复杂度等于嵌套内外层代码复杂度的乘积

内容小结

复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度是用来分析数据规模算法执行效率之间的关系,越高阶的算法时间复杂度越低,算法的时间复杂度可以粗略的表示。我们常用的算法时间复杂度主要有(从左到右排列表示其大小):

时间复杂度分析图:

图片引用自即极客时间的数据结构和算法之美的课程图片(画得比较好看)

在这里插入图片描述

摊还分析法和平均分析法

上面几节我们分析了算法执行的时间复杂度,现在我们将要讨论一下算法执行的最好情况,最坏情况了,平均情况,均摊情况。对算法的最好情况,最坏情况的分析主要是对数据规模,以及数据分布特性的分析,应为数据分布的不同导致的算法时间复杂度的不同。

最好情况

我们先看下面这段代码:

//代码片段一
int[] array  = new int[]{1,5,3,7,9,0};
public int search(int key){int pos = 0;for(int x=0;x<array.length;x++){if(array[x] == key){pos = x;break;}}return pos;
}

在代码片段一中定义了一个search函数其功能主要是在array数组中查找值为key的数据,当查找到该数据后便返回该数据在array数组中的位置,然后调用break结束循环。

这时我们讨论一个问题:当我们要查找数据1在array中的位置对应的函数参数是search(1),此时我们先观察数据1在数组中并且在位置0处,当for循环的x值为0的时候就能查找到该元素并且结束循环保存x的值,我们发现此时for循环只执行了一次那么整个代码的时间复杂度是不是就是O(1)。

由上述分析我们可以得到一个结论:最好时间复杂度就是,在理想情况下这段代码执行的时间复杂度(这个理想的时间复杂度会跟随数据的规模和分布特性而发生改变)。

最坏情况

最坏时间复杂度我们借助最好时间复杂度的代码片段一进行分析:

假设现在我们要查找数据0(假设数组中的数据是唯一的没有重复值),对应的代码search(0),我们观察数据0位于数组的最后一位,当使用for循环查找数据元素便需要遍历n次才能找到数据0的位置,那么可以推出此时的时间复杂度是O(n)。

总结:最坏时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。

平均情况

我们分析过最好,最坏时间复杂度,但是两者都是处于一种极端情况,发生的概率不大。为了更好的表示程序执行的时间复杂度我们引入平均情况时间复杂度。我希望代码的时间复杂度趋于一种稳定状态不是最好也是最差。

我们要查找数据元素key在数组中的位置,有n+1种情况,该元素在0-n-1种和元素不在数组中,那么我们将所有可能发生的情况除以总情况数是不是就可以得到整个查找过程的时间复杂度?下面我们来分析一下:

在O标记法中我们可以省略掉系数,低阶,产量及时间那么得到的最终结果值是0(n)

但是这个结果并不是准确的,虽然整个查找过程有n+1中情况但是每个情况发生的概率是不一样的,下面我们来分析一下:

  • 查找成功和查找不成功的情况分别是:1/2的1/2;

  • 查找成功是在0-n-1的概率是:1/n;

  • 根据概率乘法得到查找成功的概率是:1/2n,不成功的概率是:1/2 结合所有情况可以得到如下公式:

根据上述公式得到的T(n)的值就是平均情况时间复杂度的值,我使用O表示法省略去系数,低阶,常亮值得到的依然是O(n)。

均摊情况

均摊时间复杂度和平均时间复杂度两者看起来很像但是是两个概念有细微的差别。大部分情况下我们不需要分析程序的最好,最坏,平均时间。而平均时间复杂度只有在特殊的情况下才会使用,均摊时间复杂度是在更特殊的情况下使用,对数据的要求更高。

下面我们分析一段代码来解释这一个过程:

代码引用自极客时间数据结构和算法之美的代码块(这个代码块能够更好的体现均摊时间情况)。

// array表示一个长度为n的数组
// 代码中的array.length就等于n 
int[] array = new int[n]; 
int count = 0;  
void insert(int val) {    if (count == array.length) {      int sum = 0; for (int i = 0; i < array.length; ++i) { sum = sum + array[i]; } array[0] = sum;count = 1; } array[count] = val; ++count; 
}

上述代码片段执行数据插入数组的一个功能,当数组为空时直接插入数组中,当数组满时先遍历数组计算整个数组中元素的和并将计算的结果存储入数组下标0位中,然后重置count变量,当还有数据插入时循环往复的执行上述步骤。

我们先来分析一下这个代码片段的平均时间复杂度:

这个代码块执行的过程总共有n+1中情况。当数组为空的情况下是我所期望的理想情况即都能够在O(1)的时间复杂度情况下完成插入操作,但是当数组满时这个是最坏情况我们需要花费O(n)的时间复杂度区遍历数组并且对数组进行求和操作,这里有一点需要注意的是每个情况发生的概率都是一样的(我只从插入数据的角度去观察,每次插入的过程都是一样的),可以得到如下的分析公式:

我观察一下insert插入函数和find查找函数的不同:

  • find查找函数在极端情况下是0(1),而insert函数在大多数情况下是O(1),只有在极少数情况下是O(n)

  • 对于insert插入函数来说O(1)发生的概率是非常有规律的中是在n-1个O(1)后有一个O(n),然后在有n-1个O(1),后再是O(n),这个过程是循环有序有规律的,而find函数充满了不确定性可能是O(1)也可能是O(n)也可能是平均情况。

针对这种情况我们可以使用均摊时间复杂度进行分析,我们观察insert函数每一次操作O(n)操作后面都有n-1个O(1)操作,所有可以吧耗时较多的那次操作均摊到n-1次耗时低的操作上,那么这组连续的操作的均摊时间复杂度就都是O(1)了。

总结一下均摊时间复杂度分析:均摊时间复杂度分析要求对某一数据结构有一连续的操作,而且在该操作中大部分的情况下都是时间复杂度低的操作,只有少部分的操作是耗时操作,而且这些操作之间存在一个连续关系,这个时候我们就能够尝试将这一小部分的耗时操作均摊到耗时低的操作上面。一般情况下均摊时间复杂度就是最好时间复杂度。


http://chatgpt.dhexx.cn/article/Z6EY7whb.shtml

相关文章

算法时间复杂度

在 算法基础 中&#xff0c;我们简单介绍了什么是算法、对算法的要求&#xff0c;以及说了评断算法效率的两大类方法。今天我们将重点介绍衡量算法效率的一个概念——时间复杂度。 定义 在进行算法分析的时候&#xff0c;语句的总执行次数 T(n) 是关于问题规模 n&#xff08;输…

java时间复杂度计算_时间复杂度到底怎么算

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡量不同算法之间的优劣呢&#xff1f; 主要还是从…

Python 时间复杂度计算

一、时间复杂度 1 常见的时间复杂度 #常量阶O(1)# 对数阶O(logn)# 线性对数阶O(nlogn)# 线性阶O(n)# 平方阶,立方阶....M次方阶O(n^2),O(n^3),O(n^m)# 指数阶O(2^n)# 阶乘阶O(n!) 算法的时间复杂度对比&#xff1a; O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2lo…

树的时间复杂度

时间复杂度是一个函数&#xff0c;它定量描述了该算法的运行时间。常见的时间复杂度有以下几种。 1&#xff0c;log(2)n&#xff0c;n&#xff0c;n log(2)n &#xff0c;n的平方&#xff0c;n的三次方&#xff0c;2的n次方&#xff0c;n! 1指的是常数。即&#xff0c;无论算法…

时间复杂度和空间复杂度详解

算法时间复杂度和空间复杂度 1.算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一…

全排列的时间复杂度

我们在高中的时候都学过排列组合。“如何把 n 个数据的所有排列都找出来”&#xff0c;这就是全排列的问题。我来举个例子。比如&#xff0c;1&#xff0c;2&#xff0c;3 这样 3 个数据&#xff0c;有下面这几种不同的排列&#xff1a; 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1…

十分钟搞定时间复杂度(算法的时间复杂度)

目录 1、什么是时间复杂度&#xff1f; 2、时间复杂度的计算 &#xff08;1&#xff09;单个循环体的推导法则 &#xff08;2&#xff09;多重循环体的推导法则 &#xff08;3&#xff09;多个时间复杂度的推导法则 &#xff08;4&#xff09;条件语句的推导法则 3、习题…

时间复杂度

时间频率 一个算法执行所耗费的时间&#xff0c;从理论上是不能算出来的&#xff0c;必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试&#xff0c;只需知道哪个算法花费的时间多&#xff0c;哪个算法花费的时间少就可以了。并且一个算法花费的时间与算…

什么是时间复杂度?

时间复杂度&#xff08;Time complexity&#xff09;是一个函数&#xff0c;它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述&#xff0c;不包括这个函数的低阶项和首项系数。 常见的时间复杂度 常见的算法时间复杂度由小到大…

数据结构—1.时间复杂度

目录 前言 一、时间复杂度 二、大O表示法 三&#xff0c;实例介绍 例1&#xff1a;O(N^2) 例2&#xff1a;O&#xff08;1&#xff09; 例3&#xff1a;O(M N) &#xff08;重点&#xff09;例4&#xff1a;O&#xff08;N&#xff09; 例5&#xff1a;冒泡排序&#…

时间复杂度计算-例题集合

一、常数阶二、线性阶三、对数阶四、平方阶五、多个复杂度组合&#xff1a;顺序结构六、多个复杂度组合&#xff1a;选择结构七、多个复杂结构&#xff1a;嵌套结构八、递归 ) 一、常数阶 // 常数阶 int result 100; //运行程序只执行一次 result ; //执行一次System.out…

时间复杂度详解

目录 一. 时间复杂度概念 例题1: 二. 推导大O阶 三. 几种常见的时间复杂度: 3.1常数阶: 3.2线性阶: 例题2: 3.3对数阶 3.4 平方阶: ​编辑 例题3:​编辑 解题思路: 变式1: 3.5 总结 四、空间复杂度 4.1 空间复杂度O(1) 4.2空间复杂度O(n) 例题4&#xff1a;数字…

一套图 搞懂“时间复杂度”

写在前面&#xff1a; 这篇文章是在公众号&#xff1a; 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章&#xff0c;清晰明了。 所以拿来po出来 仅供学习交流&#xff0c;如侵则删。 现已将此文收录至&#xff1a; 《数据结构》C语言版 (清华严…

各位学弟学妹,别再看教材了,时间复杂度看这篇就好了

时间复杂度是学习算法的基石&#xff0c;今天我们来聊聊为什么要引入时间复杂度&#xff0c;什么是时间复杂度以及如何去算一个算法的时间复杂度 一、刻画算法的运行时间 某日&#xff0c;慧能叫来了一尘打算给他补习补习一下基础知识&#xff0c;只见克写了一段非常简单的代码…

pytorch—torch.tensor.scatter操作解析

torch.Tensor.scatter_(dim, index, src, reduceNone) 理解scatter操作: tensor_A.scatter_(dim, index, tensor_B): tensor_B的每个元素&#xff0c;都按照 index 被scatter&#xff08;可以理解为填充&#xff09;到目标tensor_A中。 (1) index和源tensor_B维度一致; (2) t…

python scatter参数详解_python matplotlib.scatter 用法

# -*- coding: utf-8 -*- #导入模块 from matplotlib import pyplot as plt import numpy as np import pprint from math import pi,sin A1np.array([0,0]) B1np.array(([2,0],[0,2])) #以 A1为均值&#xff0c;B1为协方差矩阵&#xff0c;生成正态分布的随机数 每次生…

pytorch scatter和scatter_详解

文章目录 0. Introduction1. 定义2. 详解例1例2 Reference&#xff1a; 0. Introduction scatter() 和 scatter_() 的作用是一样的&#xff0c;只不过 scatter() 不会直接修改原来的 Tensor&#xff0c;而 scatter_() 会 PyTorch 中&#xff0c;一般函数加下划线代表直接在原来…

Pytorch中scatter与gather操作

文章目录 数据发散scatter带聚集的发散scatter_add_onnx中scatterND数据聚集gather 数据发散scatter 函数原型pytorch官方文档scatter_&#xff1a; scatter_(dim, index, src) → Tensor注&#xff1a; scatter_是scatter的就地操作。 对于一个三维的张量来说&#xff0c;张…

pytorch中scatter()、scatter_()详解

scatter()、scatter_() scatter() 和 scatter_() 的作用一样。 不同之处在于 scatter() 不会直接修改原来的 Tensor&#xff0c;而 scatter_() 会在原来的基础上对Tensor进行修改。 torch.scatter()官方文档 scatter(dim, index, src)将src中数据根据index中的索引按照dim的…

torch_scatter.scatter()的使用方法详解

目录 1. 参数2. 示例2.1 简单示例2.2 顺序问题2.3 维度问题 1. 参数 具体来讲&#xff0c;scatter函数的作用就是将index中相同索引对应位置的src元素进行某种方式的操作&#xff0c;例如sum、mean等&#xff0c;然后将这些操作结果按照索引顺序进行拼接。下面我用具体的例子来…