<数据结构> 时间、空间复杂度

目录

1.数据结构

2.算法

3.时间复杂度

3-1.大O渐进表示法

4.空间复杂度


1.数据结构

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

2.算法

算法(Algorithm)就是定义良好的计算过程,他取一个或一组的值为输入,并产生一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

3.时间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,

只有你把你的程序放在机器上跑起来,才能知道。

一个算法所花费的时间与其中语句的执行次数成正比比例,算法中的基本操作的执行次数,为算法的时间复杂度。

3-1.大O渐进表示法

忽略对结果影响不大的项,在实际中一般情况关注的是算法的最坏情况.

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

推导大O方法:

1.用常数1取代运行时间的所有加法常数

2.在修改后的运行次数中,只保留最高阶项

3.如果最高阶项不存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

//计算BinarySearch(二分查找)的时间复杂度
int BinarySearch(int* a, int n, int x)
{
    assert(a);
    int begin = 0;
    int end = n;
    while(begin < end)
    {
        int mid = begin + ((end - begin) >> 1);
        if(a[mid] < x)
            begin = mid + 1;
        else if(a[mid] > x)
            end = mid;
        else
            return mid;                        
    }
    return -1;
}
//取最坏情况找不到目的数,每次查找后N要除以2,当除到结果为1时,查找结束。那么 2^x = N ,x = log2 N。 
//二分查找的时间复杂度为O(logN)
//计算递归程序的时间复杂度
long long Fac(size_t N)
{
    if(0 == N)
        return 1;
    for(size_t i = 0; i < N; ++i)
    {
        printf("%d", i);    
    }
    printf("\n");
    
    return Fac(N - 1) * N;
}
//程序递归N次,在每次递归中循环打印N,N-1,N-2...次
//该程序的时间复杂度为O(N^2)
//计算斐波那契递归Fib的时间复杂度
long long Fib(size_t N)
{
    if(N < 3)
        return 1;
    
    return Fib(N - 1) + Fib(N - 2);
}
//计算结果为2^(N - 2) + 1
//该时间复杂度为O(2^N)

4.空间复杂度

空间复杂度也是一个数学表达函数式,是对一个算法在运行的过程中临时占用存储空间大小的量度。

空间复杂度计算的是变量的个数。

空间复杂度的计算规则基本跟时间复杂度类似,使用大O渐进表示法。

注意:

函数运行时所需要的栈空间(存储参数、局部变量、一些寄存信息等)在编译期间就已经确定好了,因此空间复杂度主要通过函数在运行时侯显式申请的额外空间来确定。

//计算阶乘递归Fac的空间复杂度
long long Fac(size_t N)
{
    if(N == 1)
        return 1;
    
    return Fac(N - 1) * N;
}
//建立了N个栈帧 空间复杂度为O(N) 
//计算斐波那契递归的空间复杂度
long long Fib(size_t N)
{
    if(N < 3)
        return 1;
    
    return fib(N - 1) + Fib(n - 2);
}
//空间复杂度为O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值