首页 > 编程语言 >算法第一课:复杂度引入

算法第一课:复杂度引入

时间:2024-02-16 09:04:25浏览次数:24  
标签:遍历 复杂度 第一课 算法 时间 数组 就是

算法复杂度

算法复杂度分两种,时间复杂度和空间复杂度。分别代表了算法的用时,以及算法所占用的内存空间。复杂度越小,运行效率越高。

复杂度表示法

一般用大写字母 \(O\) 表示,称为大 \(O\) 表示法。比如 \(O(n)\),\(O(n^2)\) 等。这里的 \(n\) 代表了算法的输入规模,比如数组的长度,链表的长度等。\(n\) 和 \(n^2\) 表示了算法的复杂度,\(n\) 表示线性复杂度,\(n^2\) 表示平方复杂度。

复杂度分级

常见的复杂度,按照性能从高到低排序如下:

  1. 常数阶 \(O(1)\)
  2. 对数阶 \(O(logn)\)
  3. 线性阶 \(O(n)\)
  4. 线性对数阶 \(O(nlogn)\)
  5. 平方阶 \(O(n^2)\)
  6. 立方阶 \(O(n^3)\)
  7. K 次方阶 \(O(n^k)\)
  8. 指数阶 \(O(2^n)\)
  9. 阶乘阶 \(O(n!)\)
  10. 无穷阶 \(O(n^n)\)

时间复杂度分析

举例说明:

如果一个算法的运行时间固定的,也就是无论数据多大,运行时间都是一样的,那么这个算法的时间复杂度就是 \(O(1)\)。比如一个数组,长度为 \(n\),那么取出数组中的第一个元素,时间复杂度就是 \(O(1)\)。

比如一个数组,长度为 \(n\),那么遍历这个数组,时间复杂度就是 \(O(n)\)。如果遍历两次,那么时间复杂度就是 \(O(2n)\),但是常数阶可以忽略,所以时间复杂度还是 \(O(n)\)。如果遍历两个数组,那么时间复杂度就是 \(O(n+m)\),也可以忽略常数阶,所以时间复杂度还是 \(O(n)\)。

如果遍历一个二维数组,那么时间复杂度就是 \(O(n^2)\)。如果遍历一个三维数组,那么时间复杂度就是 \(O(n^3)\)。如果遍历一个 \(n\) 维数组,那么时间复杂度就是 \(O(n^n)\)。

如果是一个二分查找算法,它的时间复杂度就是 \(O(logn)\)。之所以会出现对数,是因为每次查找都会把数组长度缩小一半,所以运行次数 \(k\) 满足 \(2^k=n\),所以 \(k=logn\)。

空间复杂度分析

如果一个算法的内存占用是固定的,也就是无论数据多大,内存占用都是一样的,那么这个算法的空间复杂度就是 \(O(1)\)。

如果一个算法的内存占用和数据规模成正比,那么这个算法的空间复杂度就是 \(O(n)\)。比如一个数组,长度为 \(n\),要求这个数组的前缀和,那么就需要一个长度为 \(n\) 的数组来存储前缀和,所以空间复杂度就是 \(O(n)\)。

此外要注意的是空间复杂度在涉及到关于递归的算法时,要考虑到递归调用的栈空间,比如一个递归函数,每次递归都会调用自身,那么递归的次数就是 \(n\),所以空间复杂度就是 \(O(n)\)。

在递归算法中,我们一般主要考虑时间复杂度,对于空间复杂度相比之下不是很关注。但在极端情况下仍然需要记得考虑这种情况。

标签:遍历,复杂度,第一课,算法,时间,数组,就是
From: https://www.cnblogs.com/NayamiOR/p/18016885

相关文章

  • 读十堂极简人工智能课笔记03_遗传算法与进化
    1. 寻找正确答案1.1. 卡尔·西姆斯1.1.1. 计算机图形艺术家和研究者1.1.2. 演示过数字进化之创造性和新颖性的先驱1.1.3. 1994年1.1.3.1. 创造一批能游泳、走路、跳跃,甚至互相竞争的虚拟动物震惊了整个科学界1.1.3.2. 它们的人工大脑却是个极其复杂的网络,信息经由传......
  • 基于双树复小波变换和稀疏表示的多光谱和彩色图像融合算法matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本MATLAB2022a 3.算法理论概述     基于双树复小波变换(Dual-TreeComplexWaveletTransform,DT-CWT)和稀疏表示的多光谱和彩色图像融合算法是一种先进的图像融合技术,旨在将多光谱图像(MultispectralImages,MSI)和彩......
  • 【算法】006_图
    图的表示图的表示方法有很多种,如果遇到不同的表示方法,可以转换成自己最常用的那一种publicclassGraph{publicHashMap<Integer,Node>nodes;//点集publicHashSet<Edge>edges;//边集publicGraph(){}publicGraph(HashMap<Integer,Node>node......
  • 洛谷【算法1-5】 贪心
    P2240【深基12.例1】部分背包问题-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=110;intn,t;structnode{intm,v;};boolcmp(nodeaa,nodebb){returnaa.v*bb.m>bb.v*aa.m......
  • svm算法
    支持向量机(supportvectormachines,SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合......
  • 【算法】【动态规划】过桥问题
    1 题目在一个夜黑风高的晚上,有n(n<=50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是......
  • 回溯算法模板
    回溯算法的模板通常包含递归函数和回溯过程。以下是一个通用的回溯算法模板:defbacktrack(start,path,other_parameters):#满足结束条件时,将当前路径加入结果ifsatisfies_end_condition:result.append(path[:])return#从start开始遍历可......
  • 字符串KMP算法详解
    引入字符串kmp算法用于解决字符串匹配的问题:给出两个字符串\(s_1\)和\(s_2\),若\(s_1\)的区间\([l,r]\)子串与\(s_2\)完全相同,则称\(s_2\)在\(s_1\)中出现了,其出现位置为\(l\)。现在请你求出\(s_2\)在\(s_1\)中所有出现的位置。很显然,我们能够想到暴力求......
  • Tarjan 算法
    part1:离线求\(lca\)将走过的点且未回溯的标记为\(1\),已回溯的标记为\(2\),未访问标记为\(0\)把对于一点\(x\)的询问\(y\)存进相应的\(vector\),当回溯时判断如果询问的点标记为\(2\),则\(lca\)为询问的点\(y\)到根的路径上最早标记为\(1\)的点但直接找复杂度不对......
  • 使用lanczos算法进行的预处理共轭梯度算法(Preconditioned Conjugate Gradients Metho
    构造预处理矩阵M(对称正定)下图来自:预处理共轭梯度法(1)......