当前位置:   article > 正文

数据结构初阶--复杂度分析_判断结构的复杂度

判断结构的复杂度

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

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

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

1.时间复杂度

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

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

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

1.1大O渐进表示法

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

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

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

实例:

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

  1. int BinarySearch(int * a , int n , int x)
  2. {
  3. assert(a);
  4. int begin = 0;
  5. int end = n-1;
  6. //[begin, end]:begin 和 end 是左闭右闭区间
  7. while(begin <= end)
  8. {
  9. int mid = begin + (end - begin)>>1);
  10. if(a[mid] < x)
  11. begin = mid + 1;
  12. else if(a[mid]>x)
  13. end = mid -1;
  14. else
  15. return mid;
  16. }
  17. return -1;
  18. }

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

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

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

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

  1. long long Fac(size_t N)
  2. {
  3. if(0 == N)
  4. return 1;
  5. return Fac(N-1)*N;
  6. }

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

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

size_t ---  typedef unsigned int 

3.

  1. long long Fac(size_t N)
  2. {
  3. if(0 == N)
  4. return 1;
  5. for(size_t i = 0; i < N ; i++)
  6. {
  7. ...
  8. }
  9. return Fac(N-1)*N;
  10. }

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的时间复杂度

  1. long long Fib(size_t N)
  2. {
  3. if(N < 3)
  4. return 1;
  5. return Fib(N-1)+Fib(N-2);
  6. }

时间复杂度: 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;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/944044
推荐阅读
相关标签
  

闽ICP备14008679号