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

article/2025/11/10 18:59:17

目录

前言

一、时间复杂度

二、大O表示法

三,实例介绍

例1:O(N^2)

例2:O(1)

例3:O(M +N)

(重点)例4:O(N)

例5:冒泡排序( O(N^2) )

例6:二分法查找(O(log2N))

例7:

(1)递归法(阶乘)O(N) | O(1)

(2)递归法(斐波那契数列)( O(2^N))

总结



前言

     本文介绍数据结构的入门——时间复杂度。将会对时间复杂度进行剖析,通过例题讲解时间复杂度的应用范围和注意事项。


一、时间复杂度


概念:算法的时间复杂度是一个函数:(是数学含义上的函数)数据里面带未知数的函数式。

含义:算法在机器中运行所消耗的时间。

实际意义:算法中基本操作的执行次数。

作用和理解:降低占用内存和减少运行时间,提高效率。

好的算法相当于拿着筷子吃饭,差的算法相当于拿着竹竿吃饭,又长又麻烦。


二、大O表示法

大O符号(Big O notation):用于描述函数渐进行为的数学符号(描述时间复杂度)

推导大O阶方法:

1,用常数1取代运行次数中的所有加法常数;

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

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

含义:(保留最高阶的未知数,不保留常系数)。


三,实例介绍

例1:O(N^2)

找到某条基本语句与问题规模N之间的数学表达式,就是算出了算法的时间复杂度。

代码如下:

//请计算一下Func1中的++count语句总共执行了多少次?
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--){++count;}printf("%d\n",count);

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

  • N =10     F(N) = 130
  • N =100    F(N) =10210
  • N = 1000  F(N) =1002010
  • 随着N的变大,后两项的结果影响逐渐变小
  • 当N无限大的时候,后两项对结果的影响可以忽略不计。
  • 所以时间复杂度为O(N^2)。

例2:O(1)

代码如下:

void Func2(int N)
{int count =0;for(int i =0;i<100;++i){      ++count;}

如果只是循环次数只是常数项的话者就直接是O(1)

例3:O(M +N)

代码如下:

void Func1(int N, int M)
{int count =0;for(int i =0;i<N;++i){++count;}for(int k = 0; k < M; ++k){ ++count;}printf("%d\n",count);

虽然是不同的未知数,但是时间复杂度O只看阶数:所以为O(M)或O(N)

(重点)例4:O(N)

计算strchr的时间复杂度

const char* strchr(const char *str,int character);
whlie(*str)
{if(*str==chaeacter)return str;else++str;
}
return NULL;

此类时间复杂度是通过输入进去的数组的元素个数确定。

  • 最好可以为1
  • 最坏可以为N
  • 但是时间复杂度一般取最坏的情况,所以此题的搜索数组数据的时间复杂度为O(N)
  • 有些算法的时间复杂度存在最好,平均,最坏情况:
  • 最坏情况:输入任意规模的最大运行次数(次数上限)
  • 平均情况:输入任意期望的运行次数
  • 最好情况:输入任意规模的最小运行次数(次数下限)

例5:冒泡排序( O(N^2) )

int Fib(int *a, int size_a)
{for (int i =0;i<size_a -1;i++){for (int j = 0; j< size_a -1 -i;j++){int temp;if( a[j] < a[j+1] ){temp = a[j];a[j] = a[j+1]a[j+1] = temp;}}}}

例6:二分法查找(O(log2N))

我们要准确分析算法时间的复杂度,一定要去看思想,不能只去看程序是几层循环。

int BinarySearch(int*a, int n, int x)
{assert(a);     //排序int begin =0;int end =n;while (begin <end){int mid = begin +((end-begin)>>1);if(a[mid] < x)begin = mid+1;else if(a[mid]> x)end = mid;else return mid;}return -1;
}

 N(循环次数)X(查找次数)

 通常运算级的大小在初始基数特别大的时候比较有优势。


例7:

(1)递归法(阶乘)O(N) | O(1)

时间复杂度计算·

1,每次函数调用为O(1),那么就看他的递归次数

 2,每次函数调用不是O(1),那么就看他的递归调用中次数的累加

long  long Fac (size_t N)
{if(0 ==N)return 1;return Fac(N-1)*N;
}

(2)递归法(斐波那契数列)( O(2^N))

long long  Fib(size_t N)
{if(N < 3)return 1;return Fib(N-1) +Fib(N-2);
}

 递归法算斐波那契数列是比较占用内存的一种方法,运行次数随着设定值呈指数性增长。

总结

1.本次讲了时间复杂度的基本认识。

通过对7例不同的时间复杂度的分析,我们可以得出以下结论:

(1)时间复杂度不局限与循环有关,核心是与算法思想有关。

(2)时间复杂度主要取其最坏循环次数。

(3)通过对时间复杂度的认识,能更好的对我们的程序进行优化。


http://chatgpt.dhexx.cn/article/42uMOKWJ.shtml

相关文章

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

一、常数阶二、线性阶三、对数阶四、平方阶五、多个复杂度组合&#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;然后将这些操作结果按照索引顺序进行拼接。下面我用具体的例子来…

torch.scatter

本文目录 一、函数简介二、二维举例三、详解执行过程1. 第一步2. 第二步3. 第三步4. 问题 一、函数简介 torch.scatter(input, dim, index, src) dim ([int]) – the axis along which to indexindex (LongTensor) – the indices of elements to scatter, can be either emp…

Python中的scatter

假设X与Y&#xff0c;其中X是5X2矩阵 关于X_demo[Y_demo0 , 0],是一种获取子矩阵的方式 因为Y_demo取值只是0与1&#xff0c;可以看做一个布尔数组&#xff0c; 在X_demo[取Y_demo中为0的行&#xff0c;只取第0列] 正好对应 而在scatter(横坐标&#xff0c;纵坐标) 现在已经…

scatter python_Python中scatter()函数--转载

原博文 2017-05-13 20:46 − 原博地址:http://blog.csdn.net/anneqiqi/article/details/64125186 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1、scatter函数原型 2、其中散点的形状参数marker如下:... 相关推荐 …

scatter python_python中的scatter()方法

1、scatter函数原型 2、其中散点的形状参数marker如下&#xff1a; 3、其中颜色参数c如下: 4、基本的使用方法如下&#xff1a; #导入必要的模块 importnumpy as np importmatplotlib.pyplot as plt #产生测试数据 x np.arange(1,10) y x fig plt.figure() ax1 fig.a…

scatter python_Python的散点图绘制 scatter

python能画的图种类非常多&#xff0c;而且看上去都很好看&#xff0c;具体种类部分可参看&#xff1a;https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html#matplotlib.pyplot.figure 这里主要是探索下散点图绘制。 1. 首先是导入包&#xff0c;创建数据 imp…

scatter python_Python scatter详解

函数原型:matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,vmin=None, vmax=None, alpha=None, linewidths=None,verts=None, edgecolors=None, hold=None, data=None,**kwargs) 参数作用如下: x, y位置。 s大小。 c颜色,可能的情况…

scatter

scatter 散点图 全页折叠 语法 scatter(x,y) scatter(x,y,sz) scatter(x,y,sz,c) scatter(___,filled) scatter(___,mkr) scatter(___,Name,Value) scatter(ax,___) s scatter(___) 说明 示例 scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形的散点图。该类型的图形也…

py使用scatter画散点/气泡图

本博文源于《python数据可视化》&#xff08;黑马程序员编著&#xff09;。旨在讲解python如何使用scatter函数进行绘画散点图和气泡图。先讲解scatter函数参数如何使用&#xff0c;然后再演示两个例子进行绘画散点图和气泡图 scatter函数参数讲解 scatter(x,y,sNone,cNone,m…

ComposeOptions.kotlinCompilerVersion is deprecated

我为我的 Compose 工程升级 AGP 后 &#xff08;7.0.0 > 7.0.2&#xff09;重新编译发生下面错误 ComposeOptions.kotlinCompilerVersion is deprecated. Compose now uses the kotlin compiler defined in your buildscript. 以前需要通过该 composeOptions 指定 Kotlin 版…

比 Java 更强大的 kotlin.Deprecated

我们都知道 Java 有一个java.lang.Deprecated注解&#xff0c;用来将一个 API 标记为“废弃”&#xff0c;或者说“不建议使用”。比如 String 类就有一个被标记为 Deprecated的构造函数&#xff1a; Deprecated public String(byte ascii[], int hibyte) {this(ascii, hibyte…