算法---------空间复杂度

简介: 算法---------空间复杂度

空间复杂度

空间开销(内存开销)与问题规模n之间的关系

例1:

我们依然选择上篇文章中将时间复杂度用到的实例:

void loveyou(int n)//n为问题规模
{
  int i = 1;
  while (i <= n)
  {
    i++;
    printf("I LOVE YOU%d", i);
  }
  printf("I LOVE YOU More than %d\n", n);
}

将该程序放入计算机中,它在内存中,存储形式如下所示:

由此可知,无论问题规模怎么变化,算法运行所需的内存空间都是固定的常量,算法空间复杂度为S(n)=O(1),这也被称为算法原地工作。

算法原地工作是指:算法所需内存空间为常量。


但并不都是无论问题规模怎么变化,算法运行所需的内存空间都是固定的常量的这种情况。

例2:

我们依然选择上篇文章中将时间复杂度用到的实例:

void loveyou(int n)
{
  printf("I LOVE YOU More than %d\n", n);
  int i = 1;
  while (i < n)
  {
    if (Flag[i] == n)
      printf("I LOVE YOU%d\n", i);
  }
}
//Flag数组乱序存放1-n这些数
int Flag[n]={1.....n};
loveyou(Flag,n);

将该程序放入计算机中,它在内存中,存储形式如下所示:

此时,空间复杂度就和时间规模n有关联,由此可得算法空间复杂度为S(n)=O(4n+8)=O(n)

例3:

void test(int n)
{
  int flag[n][n];
  int i;
  ......
}

对于这个程序代码,我们依然可以根据上面的分析过程进行分析,不过需要提醒的是:

int flag[n][n];//所占内存空间为:4n*n,而不是16n*n
//原因:该数组被定义为整形数组,那么该数组一个元素所占据的空间是4B,数组元素的个数有n*n个

由此可得该算法的空间复杂度为:S(n)=4nn+8=O(nn)

例4:

void test(int n)
{
  int flag[n][n];
  int other[n];
  int i;
}

对于这个程序代码,我们分析得出算法空间复杂度为:S(n)=4nn+n+8=O(nn)+O(n)+O(1)=O(n*n).


总结:

程序代码在内存中所占的空间是大小不变的,因此在分析空间复杂度时,只需要分析变量所占的空间,计算出算法空间复杂度后,处理方式依然和时间复杂度相同,保留高阶,忽略低阶(不懂得可以参考上篇文章)

函数递归调用带来的内存开销:

每次调用所需内存空间的大小相同:

举例:

void loveyou(int n)
{
  int a, b, c;//每次调用,a,b,c的值虽然没有改变,但存储位置法会随着n变化
  if (n > 1)
  {
    loveyou(n - 1);
  }
  printf("I love you %d\n", n);
}
int main()
{
  loveyou(5);
}

分析过程如下:

由此,我们可以得出一个结论:空间复杂度=递归调用的深度

void loveyou(int n)
{
  int flag[n];
  if (n > 1)
  {
    loveyou(n - 1);
  }
  printf("I love you %d\n", n);
}
int main()
{
  loveyou(5);
}

与上面那个例子不同的是:该实例中的int flag[n]中的n,也会随着调用次数而变化,因此,每一级数组的长度是不同的,这也导致,每一级的调用空间是不同的。


因此,各级调用的空间复杂程度为:1+2+3+4+5+…+n=[n(1+n)]/2=1/2nn+1/2n,故S(n)=O(n*n).

相关文章
|
4月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
107 6
|
6月前
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
80 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
7月前
|
机器学习/深度学习 存储 算法
颠覆认知!Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【7月更文挑战第22天】在Python算法设计中,时间与空间复杂度是评估算法效能的核心。时间复杂度不仅限于大O表示法,还涵盖平均与最坏情况分析。空间复杂度虽关注额外存储,但也反映内存效率。平衡二者需视场景而定,如利用原地算法减少内存消耗,或牺牲空间加速执行。算法优化技巧,如分治与动态规划,助你在资源与速度间找寻最优解,从而高效应对大数据挑战。
70 3
|
4月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
4月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
347 0
算法的时间复杂度和空间复杂度
|
5月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
55 4
|
5月前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
100 3
|
4月前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
6月前
|
搜索推荐
九大排序算法时间复杂度、空间复杂度、稳定性
九大排序算法的时间复杂度、空间复杂度和稳定性,提供了对各种排序方法效率和特性的比较分析。
256 1
|
7月前
|
存储 算法 搜索推荐
深度剖析 Python 算法:时间复杂度与空间复杂度的爱恨情仇,你站哪边?
【7月更文挑战第23天】在Python算法设计中,时间复杂度与空间复杂度如影随形,反映算法效率与资源消耗。时间复杂度揭示算法随输入规模增长的计算趋势,空间复杂度关注额外存储需求。找最大值示例中,两种实现均具O(n)时间与O(1)空间复杂度,但在排序等复杂场景下,如冒泡排序与快速排序,或哈希表与二叉树查找,权衡变得关键。实时系统偏好低时间复杂度算法,存储受限环境则需关注空间效率。最佳选择依应用场景而定,掌握二者平衡,方能编写高效代码。
51 10

热门文章

最新文章