首页 > 其他分享 >第0章. 时空复杂度

第0章. 时空复杂度

时间:2023-12-06 20:14:56浏览次数:20  
标签:int 复杂度 log2n 表示法 算法 test 时空

时空复杂度

一、时间复杂度


  • 时间复杂度:估算程序指令的执行次数(执行时间)

1.1 大O表示法(Big O)

  • 一般用大O表示法来描述复杂度,它表示的是数据规模n对应的复杂度
  • 它并不是用于来真实代表算法的执行时间,它是用来表示代码执行时间的增长变化趋势的
  • 忽略常数、系数、低阶
    • 9 —— O(1)
    • 2 n + 3 —— O(n)
    • n2 + 2 n + 6 —— O(n2)
    • 4 n3 + 3 n2 + 22 n + 100 —— O(n3)

1.2 对数阶的细节

  • 对数阶一般省略底数,统称为O(log n)

问题:算法时间复杂度为什么用"log n",而不用"log2n","lg n"

原因:

假如有logab,由换底公式可得:

img

logca(c为底数)为常数,

由O的运算规则"O( C × f(N) )=O( f(N ) ),

其中C是一个正的常数"

得O(logab)=O(logcb)

可知算法的时间复杂度与不同底数只有常数的关系,而常数在大O表示法中可以省略,自然可以用log N代替。

例如:log2n = log29 · log9n

O(log2n) = O(log29 · log9n) = O(log9n)

可知不同底数的算法时间复杂度只有常数的关系,而常数在大O表示法中可以省略,自然可以用log N代替。

1.3 常见的时间复杂度排序

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2^) < O(n^3^) < O(2^n^) < O(n!) < O(n^n^)

1.4 多个数据规模的情况

public void test(int n, int k) {
    for (int i = 0; i < n; i++) {
        System.out.println("test");
    }
    for (int i = 0; i < k; i++) {
        System.out.println("test");
    }
}
// 时间复杂度为:O(n + k)

1.5 时间复杂度举例

public void test(int n) {
    int i = 1;
    while(i < n)
    {
        i = i * 2;
    }
}
  • 设循环执行k次,则k次后i的值为2k,退出循环的条件是2k == n,可以算出k= log2n 时退出循环
  • 即这个算法执行的总次数= 1 + (k + 1) + k = 2 k + 2 = 2 log2n + 1
  • 根据大O表示法这个算法的时间复杂度为O(log n)
public void test(int n) {
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < 15; j ++) {
            System.out.println("test");
        }
    }
}
  • 内层循环执行的次数1 + 16 + 15 + 15 = 47次
  • 外层循环执行1 + (n + 1) + n = 2 n + 2次
  • 则一共执行(2 n + 2) * 47 = 94(n + 1)
  • 根据大O表示法这个算法的时间复杂度为O(n)
public int fib(int n) {
    if (n <= 1) return n;
    return fib(n - 2) + fib(n - 1);
}
  • 算法的核心代码就是fib(n - 2) + fib(n - 1)
  • 这个算法执行多少次就取决于fib函数被调用多少次
  • 例如n = 5,画出递归树

二、空间复杂度


  • 空间复杂度:估算算法所需占用的存储空间

2.1 常见的空间复杂度

  • O(1)
int i = 1;
int j = 2;
int m = i + j;
  • O(n)
int[] arr = new int[n];
for(int i = 0; i < arr.length; i ++) {
    arr[i] = i;
}

标签:int,复杂度,log2n,表示法,算法,test,时空
From: https://www.cnblogs.com/keyongkang/p/17880407.html

相关文章

  • 时间复杂度为 O(n^2) 的排序算法
    对于小规模数据,我们可以选用时间复杂度为O(n2)的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下,O(n2)的排序算法可能会比O(nlogn)的排序算法执行效率高。不过随着数据规模增大,O(nlogn)的排序算法是......
  • 时间复杂度为 O(nlogn) 的排序算法 | 京东物流技术团队
    归并排序归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下:划分:分解待排序的n个元素的序列成各具n/2个元素的两个子序列,将长数组的排序问题转换为短数组的排序问题,当待排......
  • 时间复杂度
    时间复杂度时间频度:一个算法的语句执行次数称为时间频度时间复杂度:忽略常数、低次项和忽略系数......
  • 机器学习——K近邻算法-kd(简化因数据过过多而造成的搜索复杂度大)
    kd树是为了减少搜索最近邻点的时间复杂度,一般来说可以使用穷举法,但是太耗时,因此采用平衡二叉树的思想来解决这个问题"""ThisistheimplementationofKnn(KdTree),whichisaccessibleinhttps://github.com/FlameCharmander/MachineLearning,accomplishedbyFlameCharma......
  • 时间复杂度与空间复杂度
    时间复杂度:主要衡量的是一个算法的运行速度。空间复杂度:主要衡量一个算法所需要的额外空间。在计算机发展的早期,计算机的存储容量很小,所以对空间复杂度很是在乎。但是随着计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法......
  • NEFU OJ Problem1487 时空乱流题解
    时空乱流Problem:ETimeLimit:1500msMemoryLimit:65535KDescription星际飞行员Alice在一次航行中遭遇了时空乱流,时空乱流将导致Alice乘坐的飞船在n个位面之间穿梭。星际宇航局管理员Bob收到了Alice的求救信号,决定在某些位面上设立监测站,当Alice进入某个已经设立监......
  • 区间树上查找所有与给定区间相交的区间-算法复杂度正确性证明
    区间树是在平衡树上维护的数据结构,按照左端点大小排序。详见《算法导论》。算法设计思路红黑树的拓展在红黑树上维护结点属性\(min,max\):\(min\)表示该结点及其所有后代结点中的区间低端的最小值。\(max\)表示该结点及其所有后代结点中的区间高端的最大值。在插入时,对结点......
  • 空间复杂度
    代码随想录笔记:空间复杂度:对一个算法在运行过程中占用内存空间大小的量度。注意对于与算法无关的空间不算入时间复杂度,例如存储某些输入的数组。不要以为空间复杂度就已经精准的掌握了程序的内存使用大小,很多因素会影响程序真正内存使用大小,例如编译器的内存对齐,编程语言容器的......
  • 由数据范围反推算法复杂度以及算法内容
    由数据范围反推算法复杂度以及算法内容一般ACM或者笔试题的时间限制是1秒或2秒。在这种情况下,\(\mathrm{C}++\)代码中的操作次数控制在\(10^{7}\sim10^{8}\)为最佳。下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:\(n\leq30\),指数级别,\(\mathrm{dfs......
  • 一篇掌握华三企业设备---密码复杂度要求(收藏备用)
    作者:网络之路一天 首发公众号:网络之路博客(ID:NetworkBlog)关于密码复杂度要求实际中有的环境对于密码的复杂度、多久修改密码有要求或者客户不想弄的这么复杂,这个时候就需要来定义密码复杂度要求了。[CoreA]local-useradmin[CoreA-luser-manage-admin]passwordsimpleadminThe......