数据结构初阶--复杂度分析

数据结构练习:大话数据结构 殷人昆c++ 剑指offer和程序员代码面试指南 leetcode 牛客

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

算法就是定义良好的计算过程,取一个或一组的值为输入,并产生出一个或一组值作为输出。

1.时间复杂度

时间复杂度主要衡量一个算法运行快慢

算法的时间复杂度是一个函数(数学中带未知数函数式)

算法中的基本操作执行次数,为算法的时间复杂度

1.1大O渐进表示法

①用常数1取代运行时间中的所有加法常数(O(1)代表常数次

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

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

实例:

1.计算二分查找(有序)的时间复杂度(O(logN))

int BinarySearch(int * a , int n , int x)
{
    assert(a);

    int begin = 0;
    int end   = n-1;
    //[begin, end]:begin 和 end 是左闭右闭区间
    while(begin <= end)
    {
        int mid = begin + (end - begin)>>1);
        if(a[mid] < x)
            begin = mid + 1;
        else if(a[mid]>x)
            end = mid -1;
        else 
            return mid;
    }

return -1;

}

每次查找,查找区间缩小一半,查找多少次,除2多少次

N / 2/2/2/2... = 1

假设查找了x次,N = 1*2*2*2*2 *...2(x个2)  即N = 2^x   x = logN

2.计算阶乘递归Fac的时间复杂度

long long Fac(size_t N)
{
    if(0 == N)
        return 1;

    return Fac(N-1)*N;

}

Fac(N)调用Fac(N-1); Fac(N-1)调用Fac(N-2)... 

递归了N次,每次调用里面执行2个操作 ---> 2N    O(N)

size_t ---  typedef unsigned int 

3.

long long Fac(size_t N)
{
    if(0 == N)
        return 1;

    for(size_t i = 0; i < N ; i++)
    {
        ...

    }

    return Fac(N-1)*N;
}

Fac(N) --- 1+N+1  = N+2

Fac(N-1) --- 1+N-1+1 = N+1

....

Fac(1)  --- 1+1+1 = 3

时间复杂度:N+2 + N+1 +.... +3 == NxN = N^2 

4.计算斐波那契递归Fib的时间复杂度

long long Fib(size_t N)
{

    if(N < 3)
        return 1;

    return Fib(N-1)+Fib(N-2);
}

时间复杂度: 2^N

2.空间复杂度

空间复杂度主要衡量一个算法运行所需要的额外空间

计算开了变量的个数 

面试题 17.04 消失的数字

数组nums包含从0到N的所有整数,但其中缺了一个,请找出缺失的整数,时间复杂度限制O(N)

例:

输入:【3,0,1】

输出:2

分析思路,用复杂度分析优缺点,实现最优

思路1: 求和相减 (n+1)*n/2-(a[0]+a[1]+...) 

时间复杂度:O(N)

空间复杂度:O(1)

思路2:排序 qsort 

[0,1,3]

判断后面的数是否等于前一个数加一

时间复杂度:O(N*logN+N)

空间复杂度:O(logN)

思路3:异或  相异为1 相同为0 

a^a = 0;

a^0 = a;

a^b = b^a;

例:输入 【9,6,4,2,3,5,7,0,1】

输出:8

具体操作:

1.创建一个新数组0-9都有,两个数组的值异或,挑出来8 

时间复杂度:O(N) 空间复杂度:O(1)

2.不开辟新数组 用一个循环 创建一个变量j j++ j从0加到9 和数组中的值异或 

int x = 0;

//0和数组中的所有数异或 == 数组中的数

for(i = 0; i<numsSize; ++i)

{

 x ^= nums[i];    

}

for(j = 0; j<N+1; ++j)

{

        x ^= j;

}

return x;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值