首页 > 编程语言 >c++ day 6

c++ day 6

时间:2023-07-10 22:24:37浏览次数:50  
标签:存储 函数 复杂度 c++ var 算法 空间 day

昨天小偷了个懒 今天好好搞回来

今天还要复习一个概念知识,我这里只是记录我学习过程中的点子。

程序性能分析

我们先来看一个小故事 故事由chatgpt生成

 

时间复杂度和空间复杂度是分析算法效率和资源消耗的重要指标。

让我们逐一了解这两个概念。

时间复杂度是衡量算法执行所需时间的度量。它表示算法执行所需的操作次数与问题规模的增长率之间的关系。通常使用大O记法来表示时间复杂度。

常见的时间复杂度包括:

  • O(1):常数时间复杂度,表示算法的执行时间与问题规模无关,是最理想的情况。
  • O(log n):对数时间复杂度,通常出现在使用分治或二分法的算法中,问题规模每次减少一半。
  • O(n):线性时间复杂度,算法的执行时间与问题规模成线性关系。
  • O(n log n):线性对数时间复杂度,常见于排序算法如快速排序和归并排序。
  • O(n^2):平方时间复杂度,通常出现在嵌套循环的算法中。
  • O(2^n):指数时间复杂度,通常出现在穷举所有可能的算法中,问题规模每次增加一倍。

除了上述常见的时间复杂度,还有其他更高阶的时间复杂度。理解时间复杂度的含义和计算方法,可以帮助你评估算法的执行效率,并选择合适的算法来解决问题。

空间复杂度是衡量算法在执行过程中所需的额外内存空间的度量。它表示算法所使用的额外空间与问题规模的增长率之间的关系。同样,也使用大O记法来表示空间复杂度。

常见的空间复杂度包括:

  • O(1):常数空间复杂度,算法所需的额外空间是固定的,与问题规模无关。
  • O(n):线性空间复杂度,算法所需的额外空间与问题规模成线性关系。
  • O(n^2):平方空间复杂度,通常出现在需要二维数组或矩阵存储的算法中。

在分析空间复杂度时,需要考虑算法使用的数据结构、递归调用、临时变量等因素。理解算法的空间复杂度可以帮助你合理管理内存资源,并避免不必要的内存消耗。

通过对算法的时间复杂度和空间复杂度进行分析,你可以评估算法的效率和资源消耗,并选择最合适的算法来解决问题。同时,了解这些概念也有助于优化算法,提高程序的性能。

空间复杂度

空间复杂度的组成

  1. 指令空间(Code Space): 指令空间是用来存储程序指令的内存空间。它包含了程序的机器指令、函数代码和其他执行指令所需的数据。指令空间通常在程序加载到内存时被分配,并且在程序执行期间保持不变。

  2. 数据空间(Data Space): 数据空间用于存储程序运行时所需的数据。这包括静态数据、全局变量、常量、静态分配的数据结构等。数据空间的大小在程序运行期间可能会发生变化,取决于程序的逻辑和数据的使用情况。

  3. 环境栈空间(Stack Space): 环境栈空间是用于存储函数调用、局部变量和函数执行上下文的内存空间。每当一个函数被调用时,会在环境栈上为该函数分配一段内存空间,用于保存函数的参数、局部变量和返回地址等。随着函数的嵌套调用和递归调用,环境栈会动态地增长和收缩。

让我们通过一个简单的示例代码来详细解释每个空间的含义。

#include <iostream>

int global_var = 10;

void myFunction(int parameter) {
  int local_var = 20;
  int* dynamic_var = new int(30);

  // 打印各个变量的地址
  std::cout << "Address of global_var: " << &global_var << std::endl;
  std::cout << "Address of local_var: " << &local_var << std::endl;
  std::cout << "Address of dynamic_var: " << dynamic_var << std::endl;
}

int main() {
  int main_var = 40;

  myFunction(50);

  return 0;
}

结果不唯一:

Address of global_var: 0x7ff6af133010
Address of local_var: 0x5160fff614
Address of dynamic_var: 0x223b6551a60

现在,我们逐个解释这些空间的含义:

  1. 指令空间:指令空间是用于存储程序指令的内存空间。它包含了程序的机器指令和函数代码。在上述代码中,编译器会将 main 函数和 myFunction 函数的机器指令存储在指令空间中。这部分空间通常在程序加载到内存时被分配,且在程序执行期间保持不变。

  2. 数据空间:数据空间用于存储程序运行时所需的数据。这包括静态数据、全局变量和常量等。在示例代码中,global_var 是一个全局变量,它被存储在数据空间中。数据空间的大小在程序运行期间保持不变,取决于程序中定义的数据类型和变量。

  3. 环境栈空间:环境栈空间用于存储函数调用、局部变量和函数执行上下文。每当一个函数被调用时,会在环境栈上为该函数分配一段内存空间。在示例代码中,当 main 函数被调用时,会在环境栈上分配一段内存空间用于存储 main_var。当 myFunction 函数被调用时,会在环境栈上分配一段内存空间用于存储 parameterlocal_var 和函数的返回地址。

以上述代码为例,打印的变量地址可能是不同的,但是可以通过观察地址的相对关系来更好地理解这些空间。全局变量 global_var 的地址是固定的,它存储在数据空间中。局部变量 local_var 和动态分配的变量 dynamic_var 的地址在每次函数调用时都会有所变化,它们存储在环境栈空间中。

 

标签:存储,函数,复杂度,c++,var,算法,空间,day
From: https://www.cnblogs.com/jszs0013/p/17542490.html

相关文章

  • Java-Day-30( 多用户即时通信系统 —— 登录 + 获取在线用户列表 )
    Java-Day-30多用户即时通信系统需求分析用户登录拉取在线用户列表无异常退出私聊群聊发文件服务器推送新闻用户登录功能说明我们暂时人为规定用户名/id=100,密码123456就可以登录,其他用户不能登录后面使用HashMap模拟数据库,可以多个用户登录思路......
  • Java-Day-31( 多用户即时通信系统 —— 无异常退出 + 私聊 + 群发 )
    Java-Day-31多用户即时通信系统无异常退出问题指出:客户端输入9退出的是输出在控制台的主线程,退出的是主菜单,并没有真正的退出因为客户端启动后,相当于是开启了一个进程,在这个进程中启动了一个主线程(main线程),在main主线程中又启动了一个客户端的线程(ClientConn......
  • 1002 A+B for Polynomials C++
    Thistime,youaresupposedtofind A+B where A and B aretwopolynomials.InputSpecification:Eachinputfilecontainsonetestcase.Eachcaseoccupies2lines,andeachlinecontainstheinformationofapolynomial:K N1​ aN1​​ N2​ aN2​​ ......
  • 闲话 Day16
    这几天天气真好啊。HE这地方居然可以热成这样,属实长见识了。那么,南方那边是不是年年夏天都这么热呢。由于学OI之后体质变化比较大,所以现在主要是怕冷不怕热。然而这并不代表我可以承受比体温还高的气温。如果南方的天气一直都像这样的话,那我大学去哪里上可能还有待商榷了......
  • 如何使用C++11 STD::THREAD设置堆栈大小?
    本教程将介绍如何使用C++11std::thread设置线程的堆栈大小。C++11std::thread是一种轻量级的多线程实现,它的灵活性使得它成为一个流行的选择。但是,在某些情况下,您可能需要设置线程的堆栈大小来满足您的需求。在开始本教程之前,我们假设您已经熟悉了C++11std::thread的基础知识......
  • 遇到难题了,在线等大佬求解\C++
    intmain(){ characcounts[]={0}; charpassword[]={0}; inti=0; printf("请输入账号:>"); scanf("%s",accounts); (strcmp(accounts,"1234")==0); for(i=1;i<=3;i++) { printf("请输入密码:>"); ......
  • Day03-13 break、continue、goto
    breakbreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)    inti=0;    while(i<100){      i++;      System.out.println(i);  ......
  • Day03-14 打印三角形
    打印三角形    //打印三角形5行    for(inti=1;i<=5;i++){      for(intj=5;j>=i;j--){        System.out.print("");     }      for(intj=1;j<=i;j++){        Syst......
  • C++程序设计综合实验任选题目[2023-07-10]
    C++程序设计综合实验任选题目[2023-07-10]程序设计综合实验任选题目简单题目题目1模拟ATM机存取款管理系统设计1、问题描述模拟银行的自动取款及使用过程中的界面和用户交互过程。实现查询银行卡余额、取款、修改密码、退出系统等功能。2、功能要求(1)卡号、密码输入最多......
  • python3使用pip安装wordcloud报错error: Microsoft Visual C++ 14.0 or greater is re
    背景:使用的是Anaconda集成环境,python版本是:3.10,安装wordcloud包,使用的命令是:pipinstallwordcloud,出现报错:error:MicrosoftVisualC++14.0orgreaterisrequired.Getitwith"MicrosoftC++BuildTools":https://visualstudio.microsoft.com/visual-cpp-build-tools/......