算法复杂度

时间复杂度

  • 常数阶O(1):代码只执行一次
  • 对数阶O(logN):每次循环都离n越来越近了
int i = 1;
while(i<n) {
    i = i * 2;
}
  • 线性阶O(n):消耗的时间是随着n的变化而变化的
for(i=1; i<=n; ++i) {
   j = i;
   j++;
}
  • 线性对数阶O(nlogN):将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。
for(m=1; m<n; m++) {
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}
  • 平方阶O(n²):嵌套查询
for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}
  • 立方阶O(n³):以此类推
  • K次方阶O(n^k)
  • 指数阶(2^n)

上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。

空间复杂度

算法所占用的存储空间主要包括:

  1. 程序本身所占用的空间
  2. 输入输出变量所占用的空间
  3. 动态分配的临时空间,通常指辅助变量

常数阶O(1):只要算法不依赖于n的大小而变化即此算法空间复杂度为一个常量,可表示为 O(1)

 private void test1(int n) {
    int a = 0, b = 0, c = 0;
    int cnt;
    for (cnt = 0; cnt < n; cnt++) {
        a += cnt;
        b += a;
        c += b;
    }
}

线性阶O(n):第一行new了一个数组出来,这个数据占用的大小为n

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}
posted @ 2022-04-12 15:07  猫长寿  阅读(71)  评论(0)    收藏  举报