极客时间-数据结构与算法之美

时间复杂度表达的是代码执行时间随数据规模增长的变化趋势。

 

时间复杂度分析:

  1. 只关注循环执行次数最多的一段代码
  2. 总的时间复杂度等于量级最大的那段代码的时间复杂
  3. 乘法法则:

O(1)表示代码执行时间不会随着n的变化而变化,无论n多大;只要代码中不存在循环语句和递归语句;即为O(1);

O(logn)分析:

         i=1;

         while(i<n){

         i=i*2;

}

算代码的执行次数,即2的x次方为n的时候停止计算,那么x=log2N,故复杂度为O(log2N);不用管底数是什么,所有的复杂度都是O(logn);为什么呢?因为对数都是可以互相转换的,

log3N=log32*log2N,所以O(log3N)=O(C*log2N),其中C为常数,可以忽略系数;按照乘法法则可以计算出O(nlogn);

O(m+n):有两个输入的数据时,加法法则不再适用,但是乘法依然可以;

空间复杂度表示算法的存储空间与数据规模之间的增长关系;

常见的空间复杂度是O(1) O(n) O(n2)

 

question:为什么数组下标从0开始计算?

answer下标的定义是相对于首地址的偏移量offset,否则在计算的过程中CPU会多一次减法的运算;

寻址方式:a[k]_address = base_address + k * type_size

 

Topic:GCC中的编译器堆栈保护技术

栈区的增长方向是从高地址到低地址-栈顶地址<栈底地址;

猜你喜欢

转载自blog.csdn.net/runkui8905/article/details/88595884