首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么深度优先搜索的空间复杂度不是O(n)?

深度优先搜索(DFS)是一种用于图遍历的算法,它通过递归的方式沿着图的深度方向进行搜索。DFS的空间复杂度不是O(n),而是O(h),其中h表示图的最大深度或者树的最大高度。

深度优先搜索的空间复杂度不是O(n)的原因是因为它使用了递归的方式进行搜索,每次递归调用都会在函数调用栈中占用一定的空间。当图或树的深度很大时,函数调用栈的空间占用也会相应增加。

具体来说,DFS在搜索过程中会递归地访问每个节点,并将其标记为已访问。对于每个节点,DFS会递归地访问其相邻节点,直到找到目标节点或者无法继续搜索为止。在递归调用过程中,当前节点的信息会被保存在函数调用栈中,以便在递归返回时能够继续搜索其他节点。

由于DFS是一种深度优先的搜索方式,它会优先访问图或树的深度方向上的节点。因此,当图或树的深度很大时,DFS的空间复杂度也会相应增加。而不同于广度优先搜索(BFS)会使用队列来保存待访问的节点,DFS的空间复杂度主要取决于递归调用栈的深度。

总结起来,深度优先搜索的空间复杂度不是O(n),而是O(h),其中h表示图的最大深度或者树的最大高度。在实际应用中,我们需要根据问题的特点和数据规模来选择合适的搜索算法,以满足空间和时间的要求。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云图数据库 TGraph:https://cloud.tencent.com/product/tgraph
  • 腾讯云云服务器 CVM:https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务 TKE:https://cloud.tencent.com/product/tke
  • 腾讯云人工智能 AI Lab:https://cloud.tencent.com/product/ailab
  • 腾讯云物联网平台 IoT Hub:https://cloud.tencent.com/product/iothub
  • 腾讯云移动开发平台 MSDK:https://cloud.tencent.com/product/msdk
  • 腾讯云对象存储 COS:https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务 TBC:https://cloud.tencent.com/product/tbc
  • 腾讯云元宇宙服务 TUS:https://cloud.tencent.com/product/tus
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【漫画】为什么O(n)复杂度基数排序没有快速排序快?

这样的话,不是可以排更快吗? ? 老大:脑子反应挺快啊。是的,是可以以最高位来排序,而且也像你说,以最高位来排序的话,是可以减少数据之间比较次数。...这样子的话,空间花费不仅大,而且看起来有点背离基数排序最初思想了(“背离”这个词,个人感觉而已)。所以,我们一般采用从最低位到最高位顺序哦。 ? 关于基数排序,还有以下几个问题,你不妨也想一想?...1、基数排序是一种用空间换时间排序算法,数据量越大,额外空间就越大? 我想法:我觉得基数排序并非是一种时间换空间排序,也就是说,数据量越大,额外空间并非就越大。...因为在把元素放进桶时候,是完全可以用指针指向这个元素,也就是说,只有初始那些桶才算是额外空间。 2、居然额外空间不是限制基数排序速度原因,那为啥基数排序没有快速排序快呢?...基数时间复杂度O(n),不过他是忽略了常数项,即实际排序时间为kn(其中k是常数项),然而在实际排序过程中,这个常数项k其实是很大,这会很大程度影响实际排序时间,而像快速排序虽然是nlogn,

72010

二叉树所有路径

当然,深度优先搜索也可以使用非递归方式实现,这里不再整述。 复杂度分析 ·时间复杂度:o(N²),其中N表示节点数目。...在深度优先搜索中每个节点会被访问一次且只会被访问一次,每一次会对path变量进行拷贝构造,时间代价为O(N),故时间复杂度O(N²)。 空间复杂度:o(N²),其中N表示节点数目。...最好情况下,当二叉树为平衡二叉树时,它高度为log N,此时空间复杂度O((log N)²)。 方法二:广度优先搜索 我们也可以用广度优先搜索来实现。...如果它不是叶子节点,则将它所有孩子节点加入到队列末尾。当队列为空时广度优先搜索结束,我们即能得到答案。 复杂度分析 ·时间复杂度:o(N²),其中N表示节点数目。分析同方法 一。...·空间复杂度:o(N²),其中N表示节点数目。在最坏情况下,队列中会存在N个节点,保存字符串队列中每个节点最大长度为N,故空间复杂度o(N²)。

29830

【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!

只关注循环最多一段 代码 加法原则:取量级最大复杂度 乘法原则:取量级结果最大 分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2^n) 和 O(n!)。...类比一下,空间复杂度全称就是渐进空间复杂度(asymptotic spacecomplexity),表示算法存储空间与数据规模之间增长关系。...查看循环最多变量生成一段代码 常见复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n )。...哈希函数设计和冲突解决方法 哈希表在查找和去重等问题中应用 树与图: 二叉树遍历(前序、中序、后序) 二叉搜索性质和操作 堆和优先队列基本概念和应用 图表示方法和遍历算法(深度优先搜索...、广度优先搜索) 排序和搜索: 常见排序算法(冒泡排序、插入排序、快速排序等) 高级排序算法(归并排序、堆排序等) 二分查找和其他搜索算法实现和应用 动态规划: 动态规划基本概念和解题思路

16610

二叉树最小深度

对于每一个非叶子节点,我们只需要分别计算其左右子树最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。 复杂度分析 时间复杂度:O(N),其中N是树节点数。...·空间复杂度:O(H),其中H是树高度。空间复杂度主要取决于递归时栈空间开销,最坏情况下,树呈现链状,空间复杂度O(N)。...平均情况下树高度与节点数对数正相关,空间复杂度O(log N)。 方法二:广度优先搜索 同样,我们可以想到使用广度优先搜索方法,遍历整棵树。...当我们找到一个叶子节点时,直接返回这个叶子节点深度。广度优先搜索性质保证了最先搜索叶子节点深度—定最小。 复杂度分析 时间复杂度:O(N),其中N是树节点数。对每个节点访问一次。...·空间复杂度:O(N),其中N是树节点数。空间复杂度主要取决于队列开销,队列中元素个数不会超过树节点数。

28320

LintCode 数字三角形题目分析1 (常规动态规划解法)分析2 (如果你只用额外空间复杂度O(n)条件)

题目 给定一个数字三角形,找到从顶部到底部最小路径和。每一步可以移动到下面一行相邻数字上。...** 注意事项 如果你只用额外空间复杂度O(n)条件下完成可以获得加分,其中n是数字三角形总行数。** 样例 比如,给出下列数字三角形: ?...public int minimumTotal(int[][] triangle) { // write your code here //从底往上,把每一行元素改为其下一行能与之相加两个数得到最小值...min) min = dp[row-1][i]; } return min; } 分析2 (如果你只用额外空间复杂度...O(n)条件) 从顶部到底部最小路径和等于从底部到顶部最小路径和 //从倒数第二层开始,从底层到每一层每个数字最小路径长度等于,从底层到该层下层相邻数字最小路径长度中较小值,加上该层该数字

66920

二叉树最小深度

原题样例:二叉树最小深度 ????C#方法:深度优先搜索 ????Java 方法一:深度优先搜索 ????Java 方法二:广度优先搜索 ????总结 ????往期优质文章分享 ????...C#方法:深度优先搜索 既然是求解二叉树最小深度,那我们就把二叉树整个遍历一遍然后判断深度就好了 使用深度优先搜索方法,遍历整棵树,记录最小深度。...内存消耗:50 MB,在所有 C# 提交中击败了50.00%用户 复杂度分析 时间复杂度O( n ),其中 n 是树节点数 空间复杂度O( H ),其中 H 是树高度 ????...内存消耗:59 MB,在所有 Java 提交中击败了16.41%用户 复杂度分析 时间复杂度O( n ),其中 n 是树节点数 空间复杂度O( H ),其中 H 是树高度 ????...内存消耗:58 MB,在所有 Java 提交中击败了58.59%用户 复杂度分析 时间复杂度O(n)其中 n 是树节点数 空间复杂度O(n)其中 n 是树节点数 ????

25920

【小Y学算法】⚡️每日LeetCode打卡⚡️——28.二叉树最大深度

因此我们可以用「深度优先搜索方法来计算二叉树最大深度。 具体而言,在计算当前二叉树最大深度时,可以先递归计算出其左子树和右子树最大深度,然后在 O(1) 时间内计算出当前二叉树最大深度。...内存消耗:25.7 MB,在所有 C# 提交中击败了10.73%用户 复杂度分析 时间复杂度O(n) 空间复杂度O(n) ---- ????...因此我们可以用「深度优先搜索方法来计算二叉树最大深度。 具体而言,在计算当前二叉树最大深度时,可以先递归计算出其左子树和右子树最大深度,然后在 O(1) 时间内计算出当前二叉树最大深度。...空间复杂度O( height ) 其中height 表示二叉树高度。递归函数需要栈空间,而栈空间取决于递归深度,因此空间复杂度等价于二叉树高度。 ????...与方法一同样分析,每个节点只会被访问一次。 空间复杂度O(n),此方法空间消耗取决于队列存储元素数量,其在最坏情况下会达到 O(n)。 ---- ????

22740

二叉树最大深度

因此我们可以用「深度优先搜索方法来计算二叉树最大深度。具体而言,在计算当前二叉树最大深度时,可以先递归计算出其左子树和右子树最大深度,然后在O(1)时间内计算出当前二叉树最大深度。...复杂度分析 时间复杂度:O(n),其中n为二叉树节点个数。每个节点在递归中只被遍历一次。 空间复杂度:O(height),其中height表示二叉树高度。...递归函数需要栈空间,而栈空间取决于递归深度,因此空间复杂度等价于二叉树高度。...方法二:广度优先搜索 我们也可以用「广度优先搜索方法来解决这道题目,但我们需要对其进行—些修改,此时我们广度优先搜索队列里存放是「当前层所有节点」。...复杂度分析 ·时间复杂度:O(n),其中n为二叉树节点个数。与方法一同样分析,每个节点只会被访问一次。 ·空间复杂度:此方法空间消耗取决于队列存储元素数量,其在最坏情况下会达到O(n)。

24720

【地铁上面试题】--基础部分--数据结构与算法--排序和搜索算法

在平均情况下,顺序搜索需要遍历数据集一半,因此时间复杂度O(n/2),可以简化为O(n)。 顺序搜索空间复杂度O(1),即常数级别的额外空间。...平均情况下为O(log n),在平均情况下,二分搜索时间复杂度也是O(log n)。 二分搜索空间复杂度O(1),它不需要额外空间来存储数据结构或中间结果。...平均情况下时间复杂度也是O(V+E),因为深度优先搜索访问每个节点概率相对均匀。 在最好情况下如果使用递归实现深度优先搜索,并且树深度很小,那么递归调用空间复杂度将是O(1)。...在最坏情况下如果树深度非常大,递归调用层数可能达到树最大深度,此时空间复杂度O(D),其中D是树深度。平均情况下空间复杂度也是O(D),取决于树平均深度。...Tip:如果使用了辅助栈来实现深度优先搜索,那么空间复杂度将取决于栈大小,即O(D)。在实际应用中,为了避免栈溢出,可以通过迭代方式或限制递归深度来进行优化。

22010

☆打卡算法☆LeetCode 111、二叉树最小深度 算法解析

最小深度是从根节点到最近叶子节点最短路径上节点数量。 说明: 叶子节点是指没有子节点节点。...3,9,20,null,null,15,7] 输出: 2 示例 2: 输入: root = [2,null,3,null,4,null,5,null,6] 输出: 5 二、解题 1、思路分析 这道题首先想到就是深度优先搜索方法...时间复杂度O(N) 其中N是树节点数,对每个节点只访问一次。...空间复杂度O(H) 其中H是树高度,空间复杂度主要取决于递归时开销,递归空间复杂度O(N),平均情况下树高度与节点数对数正相关,空间复杂度O(log N),总时间复杂度就是O(H)。...三、总结 这道题用了广度优先搜索方法,同样,也可以使用广度优先搜索方法去遍历整棵树。 对于这道题来书,广度优先搜索方法可以保证最先搜索叶子节点深度一定最小。

13420

一文学会「回溯搜索算法」解题技巧

此时可以将空间复杂度降到 O(1)(不包括 path 变量和 res 变量和递归栈空间消耗),本 Python 代码正好展示了这样写法; (2)哈希表,代码留给读者完成。...; 如果每一个状态都去创建新变量,时间复杂度O(N),并且也有空间消耗。...搜索问题状态空间一般很大,在候选数比较多时候,在非叶子结点上创建新状态变量性能消耗就很严重; 就本题而言,只需要叶子结点那个状态,在叶子结点执行拷贝,时间复杂度O(N)。...路径变量在深度优先遍历时候,结点之间转换只需要 O(1)。 为什么不使用广度优先遍历?...这道题用广度优先遍历写是完全可以,我尝试过,代码写出来非常不美观。 感兴趣朋友也可以尝试写一下,尝试写广搜目的是更好地体会为什么“深搜”能成为强大“回溯搜索算法”,而广搜不是

1.2K10

二叉树最大深度(LeetCode 104)

4.解题思路 方法一:深度优先搜索 如果我们知道了左子树和右子树最大深度 l 和 r,那么该二叉树最大深度即为 max(l, r) + 1。 而左子树和右子树最大深度又可以以同样方式进行计算。...因此我们可以用「深度优先搜索方法来计算二叉树最大深度。 具体而言,在计算当前二叉树最大深度时,可以先递归计算出其左子树和右子树最大深度,然后在 O(1) 时间内计算出当前二叉树最大深度。...时间复杂度O(n),其中 n 为二叉树节点个数。每个节点在递归中只被遍历一次。 空间复杂度O(height),其中 height 表示二叉树高度。...递归函数需要栈空间,而栈空间取决于递归深度,因此空间复杂度等价于二叉树高度。...时间复杂度O(n),其中 n 为二叉树节点个数。与方法一同样分析,每个节点只会被访问一次。 空间复杂度: 此方法空间消耗取决于队列存储元素数量,其在最坏情况下会达到 O(n)。

15410

深度优先算法和广度优先算法

广度优先算法实现 广度优先算法是一种分层查找过程,每向前走一步可能会访问一批顶点,不像深度优先搜索算法那样有回溯情况,因此它不是一个递归算法。...On)。...采用邻接表存储方式时,每个顶点均需要搜索一次,故时间复杂度O(|V|),在搜索任意节点邻接点时,每条边至少访问一次,故时间复杂度O(E),算法总时间复杂度O(E+V)。...深度优先算法 深度优先算法实现 图深度优先算法类似于树先序遍历,DFS算法是一个递归算法,需要借助一个工作栈,故其空间复杂度度为O(V)。...深度优先算法邻接矩阵时间复杂度O(V*V),邻接表时间复杂度O(V+E)。

85960

☆打卡算法☆LeetCode 207. 课程表 算法解析

那么对于一个有向图,可以分为两种情况: 不是有向无环图,也就是不满足任意一条有向边(u,v),u在排列中都出现在v前面,那么就不存在满足要求排列。 是有向无环图,但是它拓扑排序可能不止一种。...求有向图G是否存在拓扑排序,可以判断是否有一种符合要求课程学习顺序,可以使用深度优先搜索流程,用一个栈来存储所有已经搜索完成节点。...那么对整个图进行一次深度优先搜索,对每个节点回溯时候,将该节点放入栈中,最后从栈顶到栈底序列就是一种拓扑排序。...时间复杂度O(n+m) 其中n为课程数,m为先修课程要求数,时间复杂度主要是对图进行深度优先搜索时间复杂度。...空间复杂度O(n+m) 其中n为课程数,m为先修课程要求数,在深度优先搜索过程中,需要最多O(n)空间进行深度优先搜索,因此总时间复杂度O(n+m)。

36920

LeetCode算法-树遍历

;复杂度分析:时间复杂度O(n):n为二叉树节点数。空间复杂度O(n):n为二叉树节点数。递归调用深度取决于二叉树高度,二叉树最坏情况下为一条链,此时高度为 N,因此空间复杂度O(N)。...空间复杂度O(n):最差情况下,空间复杂度O(n)。二叉树所有路径思路:本题考虑使用深度优先遍历。如果当前节点有左子树或右子树,就递归调用函数,直到左右子树都不存在,此时就是我们要找路径。...在深度优先搜索中每个节点会被访问一次且只会被访问一次,每一次会对 path 变量进行拷贝构造,时间代价为 O(N),故时间复杂度O(N^2)。空间复杂度O(n^2):n为二叉树节点数。...空间复杂度O(n):n为二叉树节点数。路径总和思路:考虑深度优先遍历记录从根节点到当前节点和,与target比较。...空间复杂度O(n)剑指 Offer 37. 序列化二叉树总结继续对树深度/广度优先遍历,先中后序遍历,层序遍历等遍历和递归方法,有更深入理解和学习。

64330

Python-图-如何找到三度好友?

这个时候,每个顶点都要进出一遍队列,每个边也都会被访问一次,所以,广度优先搜索时间复杂度O(V+E),其中,V 表示顶点个数,E 表示边个数。...当然,对于一个连通图来说,也就是说一个图中所有顶点都是连通,E 肯定要大于等于 V-1,所以,广度优先搜索时间复杂度也可以简写为 O(E)。...广度优先搜索空间消耗主要在几个辅助变量 visited 、queue 、prev 上。这三个存储空间大小都不会超过顶点个数,所以空间复杂度O(V)。...度内好友有:3,1, 4、图深度优先遍历 只需要将广度优先遍历中队列改为栈,就变成了深度优先遍历算法,请自行思考为什么。...这里仅仅是把队列变成了栈,因此时间复杂度空间复杂度和广度优先遍历算法是一样

73830
领券