栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

空间复杂度和时间复杂度

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

空间复杂度和时间复杂度

目录标题
  • 算法与数据结构
    • 基本概念
      • 什么是数据结构?
      • 复杂度
        • 时间复杂度
        • 空间复杂度
    • 测试例子
      • 例1.写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数
      • 例2:写程序计算给定多项式在给定点x处的值
      • 例3. 最大子列和
    • 知识点
      • 计算程序运行的时间

算法与数据结构 基本概念 什么是数据结构?

数据结构是计算机存储、组织数据的方式,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

精心限制的数据结构可以带来更高的运行或存储效率

复杂度 时间复杂度

常见的时间复杂度所耗费的时间从小到大:

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

空间复杂度

O(1)

测试例子 例1.写程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从1到N的全部正整数

解:有两种方式,循环代码量大,但节省空间;递归代码最少,但容易溢出。

每次递归就相当于调用一个函数,函数每次被调用时都会将局部数据(在函数内部定义的变量、参数、数组、对象等)放入栈中。

递归1000次,就会将1000份这样的数据放入栈中。这些数据占用的内存直到整个递归结束才会被释放,在递归过程中只会累加,不会释放。

如果递归次数过多,并且局部数据也多,那么会使用大量的栈内存,很容易就导致栈溢出了。

栈用来存储程序的局部数据 。 例如在函数内部定义的变量、指针、参数、结构体、数组、对象、引用等,它们都要保存到栈中。

栈为什么会溢出?

对每个程序来说,栈能使用的内存是有限的,一般是 1M~8M,这在编译时就已经决定了,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误,程序就崩溃了。

// 用for循环
void PrintN(int n)
{
    for(int i=1; i<=n; i++)
    {
        cout< 
例2:写程序计算给定多项式在给定点x处的值 

第一种解法:
f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + a n x n f(x)=a_0+a_1x+...+a_{n-1}x^{n-1}+a_nx^n f(x)=a0​+a1​x+...+an−1​xn−1+an​xn

double f(int n, double a[], double x) // n表示阶数,
{
    int i;
    double p = a[0];
    for(int i=1; i<=n; i++)
    {
        p += (a[i] * pow(x, i));
    }
    return p;
}

第二种解法:
f ( x ) = a 0 + x ( a 1 + x ( . . . ( a n − 1 + x ( a n ) ) . . . ) ) f(x) = a_0 +x(a_1 +x(...(a_{n-1}+x(a_n))...)) f(x)=a0​+x(a1​+x(...(an−1​+x(an​))...))

double f(int n, double a[], double x)
{
    int i;
    double p = a[n];
    for(int i=n; i>0; i--)
    {
        p = a[i-1]+x*p;
    }
    return p;
}

第二种解法运行更快,比第一张解法高了一个数量级。

时间复杂度:(看里面的乘法次数)

第一种:1+2+3+…+n = ( n^2 + n) / 2

第二种: n

例3. 最大子列和

//  算法2:
int MaxSubseqSum2(int A[], int N)
{
    int ThisSum, MaxSum = 0;
    int i,j;
    for(int i = 0; i < N; i++) // i是子列的左端位置
    {
        ThisSum = 0; // ThisSum是从A[i]到A[j]的子列和
        for(j = i; j < N; j++) // j是子列的右端位置
        {
            ThisSum
        }
    }
    return MaxSum;
}
 

知识点 计算程序运行的时间

clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即"时钟打点"。

常数CLK_TCK:机器时钟每秒所走的时钟打点数。

#define CLOCKS_PER_SEC ((clock_t)1000) 可以看到每过千分之一秒(1毫秒),调用clock ()函数返回的值就加1。 clock()是以毫秒为单位,要正确输出时间差需要把它换成秒,因此需要除以CLOCKS_PER_SEC

#include
#include

clock_t start, stop;  // clock_t是clock函数返回的变量类型
double duration;   // 记录被测函数运行时间,以秒为单位

int main()
{
	start = clock();
	//运行的函数  myfunction();
	stop = clock();
	duration = ((double)(stop - start))/CLOCKS_PER_SEC;
	
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629403.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号