精华内容
下载资源
问答
  • 算法(2)---算法复杂度理论
    2019-07-28 21:04:30

    算法(2)—算法复杂度理论

    算法复杂度:分为时间复杂度空间复杂度,一个好的算法应该具体执行时间短,所需空间少的特点。

    结论: 复杂度与时间效率的关系

    C < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量,n是一个变量且比c大)

    |-----------------|--------|-------------|
        较好             一般          较差
    

    下面举例说明。

    ## 一、概述

    1、常量阶O(1)

    O(1) 常量级复杂度,我们平时在分析时,只要代码不存在循环、递归语句,代码再多,也可以算是O(1)复杂度。

    2、对数阶O(logn)

    O(logn) 对数阶复杂度,比如下面这样的代码:

    int i = 1;
    while(i <= n){
        i = i*2;
    }
    

    它的执行次数是2x=n中的x,如果n=8,那么x=3,代表只执行3次。如果n=9,同样也执行3次。

    上面说过分析复杂度时常数可以去掉不算,推导下来还是会算回以2为底时一样的复杂度,因此,我们可以将对数的底忽略掉,统一用O(logn)表示。

    二分查找 就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

    3、线性阶O(n)

    O(n):代表数据量增大几倍,耗时也增大几倍。比如常见的for循环遍历算法。

    4、线性对数阶 n*log2n

    n*log2n 线性对数阶,比如下面这样的代码

    int num1,num2;
        for(int i=0; i<n; i++){
            num1 += 1;
            for(int j=1; j<=n; j*=2{
                num2 += num1;
            }
        }
    

    第一个for循环为O(n),第二个for循环为O(logn),那么它们一相乘就是nlogn

    5、N次方台阶O(n^N)

    O(n^N) N次方台阶在我们实际开发也会经常遇到,比如两个for循环:

    int num1,num2;
        for(int i=0; i<n; i++){
            num1 += 1;
            for(int j=1; j<=n; j++{
                num2 += num1;
            }
        }
    

    那么它的复杂度就为O(n2),常量都用变量来代替,也就是O(nN)。

    6、指数阶O(2^n)

    O(2^n) 指数阶,在什么情况会用到呢,比较常用的有求子集。比如{a,b} 的子集有{空},{a},{b},{a,b} 共4个。如果求{a,b,c}那么子集有{空},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}共8个。

    所以求子集复杂度为:O(2^n)

    7、阶乘阶O(n!)

    这个意思懂,不过还没想到什么情况会是O(n!)。

    总结

    基本复杂度的理论分析这就学完了,主要是掌握一些基础的复杂度理论,这些理论都会贯穿整个算法学习的全部,所以要牢固掌握。



    ``` 只要自己变优秀了,其他的事情才会跟着好起来(少将12) ```
    更多相关内容
  • 一、复杂度理论、 二、时间复杂度、 1、P 与 NP 问题、 2、O 表示的复杂度情况、 3、时间复杂度取值规则、 4、时间复杂度对比、





    一、复杂度理论



    时间复杂度 : 描述一个算法执行的大概效率 ; 面试重点考察 ; 面试时对时间复杂度都有指定的要求 , 蛮力算法一般都会挂掉 ;

    空间复杂度 : 程序执行过程中 , 所耗费的额外空间 ; 面试考察较少 , 程序中使用的空间 , 看变量的定义就可以知道大概数量 ;

    编程复杂度 : 代码可读性是否高 , 是否容易看懂 ; 写代码时的难度不高 , 别人读代码时的难度也不高 ; 如果写的时候经过长时间斟酌 , 那么可读性估计会很差 ;
    如 : 字符串查找 ,
    使用 蛮力算法 , 编程复杂度很低 , 很容易看懂 , 但是其时间复杂度是 O ( m × n ) O(m \times n) O(m×n) ;
    如果使用 Rabin-Karp 算法 , 时间复杂度是 O ( m + n ) O(m + n) O(m+n) , 但是编程复杂度很高 , 实现了哈希算法 , 很难看懂 ;

    思维复杂度 : 是否容易想得出 ; 算法的原理是否容易理解 ;
    算法是否容易理解 ;
    字符串查找 KMP 的算法就很难理解 , 即使把代码展示出来 , 将原理说明 , 也是很难理解的 ;


    一般 蛮力算法 时间复杂度 很高 , 但是 编程复杂度 和 思维复杂度 很低 , 代码容易理解 ;
    如果对 时间复杂度 要求很高 , 如必须达到 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) 要求 , 则必须使用复杂的算法 , 双指针 , 动态规划 , KMP 等 , 代码会写几百行 , 很难理解 ;
    二者之间需要综合考虑 , 相互作出一些妥协 ;





    二、时间复杂度




    1、P 与 NP 问题


    P 问题 ( Polynomial ) , 是有效算法的集合 , 都可以在多项式时间内完成计算 , 其 时间复杂度都是多项式 ,

    时间复杂度都是 O ( n ) O(n) O(n) , O ( n 2 ) O(n^2) O(n2) , O ( n 3 ) O(n^3) O(n3) , O ( m + n ) O(m + n) O(m+n) , O ( 1 ) O(1) O(1) , O ( n ) O(\sqrt{n}) O(n ) , O ( log ⁡ n ) O(\log n) O(logn) , O ( n log ⁡ n ) O(n \log n) O(nlogn) 等多项式 ;

    n n n 一般都在底数的位置 , 不在幂次方的位置 ;


    NP 问题 ( Nondeterministic Polynomial ) , 是没有找到一个算法可以在多项式时间内解决该问题 , 目前只找到了非多项式时间的解法 , 不确定该问题是否有多项式时间解法 ;

    时间复杂度一般是 O ( 2 n ) O(2^n) O(2n) , O ( n n ) O(n^n) O(nn) , O ( n ! ) O(n!) O(n!) 等 ;


    2、O 表示的复杂度情况


    O O O 表示算法在 最坏的情况下的时间复杂度 ;

    一般情况下 , 算法的时间复杂度都以最坏情况的时间复杂度为准 ;

    但是也有特例 , 快速排序的最坏情况下 , 时间复杂度是 O ( n 2 ) O(n^2) O(n2) , 这个时间复杂度几乎不会遇到 , 一般情况下描述快速排序的时间复杂度时 , 使用 平均时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn) ;


    3、时间复杂度取值规则


    只考虑最高次项 : 时间复杂度描述中 , 一般 只考虑最高次项 ;
    如 : O ( n 2 + n ) = O ( n 2 ) O(n^2 + n) = O(n^2) O(n2+n)=O(n2) , O ( 2 n + n 2 ) = O ( 2 n ) O(2^n + n^2) = O(2^n) O(2n+n2)=O(2n)


    不考虑常数项 : 时间复杂度描述中 , 不考虑常数项 ;
    如 : O ( n 2 + 2000 ) = O ( n 2 ) O(n^2 + 2000) = O(n^2) O(n2+2000)=O(n2)


    不考虑系数项 : 时间复杂度描述中 , 不考虑系数项 ;
    如 : O ( 2 n 2 ) = O ( n 2 ) O(2n^2) = O(n^2) O(2n2)=O(n2) ,


    O ( log ⁡ n ) = O ( log ⁡ ( n 2 ) ) = O ( log ⁡ 4 ( n ) ) O(\log n) = O(\log(n^2)) = O (\log _4 (n) ) O(logn)=O(log(n2))=O(log4(n)) , O ( log ⁡ ( n 2 ) ) O(\log(n^2)) O(log(n2)) 其中的 2 2 2 可以提取到前面 变为 O ( 2 log ⁡ ( n ) ) O(2\log(n)) O(2log(n)) , O ( log ⁡ 4 ( n ) ) O (\log _4 (n) ) O(log4(n)) 中的底数 4 4 4 提取出来变为 O ( 1 2 log ⁡ ( n ) ) O (\cfrac{1}{2}\log (n) ) O(21log(n)) , 系数项不考虑 , 不管底数是多少 , 内部 n n n 是多少次幂 , 都可以提取成系数 , 系数项不考虑 ;
    因此 , 对数的复杂度只有 O ( log ⁡ n ) O(\log n) O(logn) , 没有其它的底数或 n n n 次幂的情况 , 这些都可以提取成系数 ;
    但是系数为 n n n 除外 ;


    4、时间复杂度对比


    O ( m + n ) O(m + n) O(m+n) O ( m a x ( m , n ) ) O(max(m, n)) O(max(m,n)) 哪个复杂度更高 ;


    n + m > m a x ( m , n ) > m + n 2 n + m > max (m, n) > \cfrac{m + n}{2} n+m>max(m,n)>2m+n

    m a x ( m , n ) max (m, n) max(m,n) 是介于两个值之间的数值 ;

    O ( n + m ) = O ( m + n 2 ) O(n + m) = O(\cfrac{m + n}{2}) O(n+m)=O(2m+n) , 因此 O ( n + m ) = O ( m + n 2 ) = O ( m a x ( m , n ) ) O(n + m) = O(\cfrac{m + n}{2}) = O(max (m, n)) O(n+m)=O(2m+n)=O(max(m,n))

    展开全文
  • 我们通过证明所谓的小型化映射是两种理论之间保留了同构的约简关系,来建立(子)指数时间复杂度和参数化复杂度之间的紧密联系。 ? 2007年工业和应用数学学会。
  • 复杂度理论

    2021-03-21 18:57:34
    时间复杂度 基本可以确定是二分法 多项式(Polynomial):一般在底数位置,不在幂次项 // / / 非多项式(Nondeterministic Polynomial) // 小o:最好复杂度 ...

    概述

    量化一个算法的时间和空间

    内存空间

    • 栈空间(Stack Space)
      • 概念:操作系统开辟出的一个固定大小的空间,该空间不大,专门用来进行函数调用和递归等操作
      • 栈溢出(Stack Overflow):程序开辟过多内存,超过固定空间
      • 包含
        1. 函数参数与返回值
        2. 函数的局部变量
    • 堆空间(Heap Space)
      • 概念:保存的是具体信息(如对象,在Java中堆内存空间的开辟由new完成)
    • 二者的联系
      • 栈空间保存的是一块堆内存地址,即 栈内存 -> 堆内存 -> object

    时间复杂度

    • O(logn) 基本可以确定是二分法

    • 运算举例

    1. O(m) +O(n)=O(m+n)
    2. a*O(n)=O(kn)
    • 多项式(Polynomial):一般在底数位置,不在幂次项

    1. O(n) / O(n^2) / O(n^3)
    2. O(n + m) / O(1)
    3. O(logn) / O(nlogn)
    • 非多项式(Nondeterministic Polynomial)

    1. O(2^n) / O(n^n) / O(n!)
    • 小o:最好复杂度

    • 大O:最坏复杂度

    • 只考虑最高项

    1. O(100N + 1000)=O(N)
    • 不考虑常数项和系数

    1. O(logN)=O(logN^2)=O(log_{4}N)
    • T函数推导

    1. T: Time Complexity
    2. n: 问题规模(比如数组大小)
    3. T(n): 求处理问题规模为n的数据的时间复杂度是多少?
    4. 推到方法:不断展开的方法

    空间复杂度

    • 一般指额外空间复杂度,即不包含输入输出

    编程复杂度

    • 看得懂

    思维复杂度

    • 想得出

     

    展开全文
  • PAGE 14 算法分析与复杂度理论 实验作业 1.第一题 1.1思路设计 整体算法设计过程参考快速选择算法RANDOMIZED-SELECT算法对xi的快速排序算法的partition进行了改进将判断条件修改为寻找使xixkwi满足的最小k位置可以...
  • 复杂度理论、排序、模拟_阮行止.pdf
  • 数学建模学习方法-非标准计算--第三章计算复杂度理论(18)
  • 我们已经讨论过可计算理论了,其分析哪些问题是可以被算法解决的,链接如下:yishun:可计算性理论的理解​zhuanlan.zhihu.com现在,我们来讨论算法执行的时间复杂度。算法执行的效率主要包括2个部分:一是算法运行...
    本文资料来源于机械工业出版社出版的《算法导论》。

    我们已经讨论过可计算理论了,其分析哪些问题是可以被算法解决的,链接如下:

    yishun:可计算性理论的理解​zhuanlan.zhihu.com

    现在,我们来讨论算法执行的时间复杂度。

    算法执行的效率主要包括2个部分:一是算法运行时所需的存储空间大小(空间复杂度),二是算法运行时所需执行的指令数(时间复杂度,决定执行时间)。本文仅讨论后者。

    渐近记号

    表示以下函数集合:

    O(g(n))表示以下函数集合:

    表示以下函数集合:

    f(n)=

    或 O(g(n)),表示f(n)是
    或 O(g(n))的成员。

    运行时间随输入规模的增长

    首先要明确输入规模的概念,一般来说,它指编码算法输入所需的字节数,比如说,排序一个n个数字的数组,每个数字需要m个字节来编码,那么输入规模是m*n。但这种方法并不适用于所有情况,比如说,求大于0小于n的所有素数,输入为n,算法执行所需的时间取决于n的大小,而不是编码它所需的字节数。

    输入规模的定义取决于具体问题,也取决于输入的编码方式。

    “运行时间”指一个算法在特定输入上运行所需执行的指令数。有很多算法,在输入规模相同的情况下,不同的输入所需的运行时间也是不同的。比如插入排序,如果输入数组是已经排序好的话,插入排序的运行时间与输入规模是线性关系。一般来说,我们仅分析某个输入规模下,可能的最大运行时间,在某些特殊情况下,我们也会研究平均运行时间,比如快速排序。在本文中,我们仅研究算法在给定输入规模上的最大运行时间。

    可以发现,算法的在给定输入规模的情况下,其最大运行时间是输入规模的函数,如下面的插入排序例子所示:

    22930efd187cc3a0921da8df79471ea8.png
    插入排序代码及其分析

    0ba22f536cacf0437d9558b66e00504d.png
    插入排序的运行代价,令所有c均为1则得到”运行时间”

    可以发现插入排序的最大运行时间是输入规模的二次函数。

    在比较不同算法的执行效率时,我们比较关注的是运行时间随输入规模增长的增长量级,这是因为不同量级带来的性能差异相当巨大,占主要矛盾。

    我们用第一节的O渐近符号来表示运行时间的增长量级,比如说,对于插入排序,其运行时间满足:

    。我们称用O表示的运行时间增长量级为一个算法的
    时间复杂度,对于插入排序,其时间复杂度为

    时间复杂度的计算

    本节将讨论如何计算分治法的时间复杂度。世间算法太多,不太可能存在一个通用范式去分析所有算法,特别是对于一些随机化算法。

    我们先尽可能简单的介绍一下分治法:把输入划分为若干个与原问题相同但规模更小的子问题(直到问题规模足够小,可以直接求解),递归调用自身获取子问题的解,并将其合并获取原问题的解。

    令T(n)为某分治算法在输入规模为n时的的运行时间,且当n<=c时可以在常数时间

    内直接求解问题。假设把原问题分解为a个子问题,且每个子问题的规模为n/b。假设分解问题时间为D(n),合并子问题的解所需时间为C(n)。那么我们可以获取T(n)的递归式如下:

    127d58b8d234e130c9c32521e72e8a0a.png

    求解递归式即可得到算法的时间复杂度。求解递归式的方法有以下3种:

    • 代入法:猜测一个界,带入递归式证明是否正确。(本文不做介绍)
    • 递归树法:将递归式转化为一棵树,其节点代表不同层次递归计算的运行时间,然后采用边界和技术求解递归式。
    • 主方法:即代公式。

    首先介绍递归树法,下图为归并排序的递归式:

    2a36dd1e98497341de6d640d24e6effb.png

    其递归树如下所示:

    c40f826279f1880a3cf0b880dccb9670.png

    为了方便分析,上图已假设lg(n)为整数,这是采用递归树进行分析的几个重要技巧。上图还是蛮简单的,大家好好看看即可,这里不做介绍了。

    下面介绍主方法:

    令a

    0和b>1是常数,f(n)是一个函数,有递归式T(n)=aT(n/b)+f(n),那么T(n)有如下渐近界:
    1. 若对某个常数m>0,有
      ,则
    2. ,则
    3. 若对某个常数m>0,有
      ,且对某个常数c<1和所有足够大的n有af(n/b)
      cf(n),则

    不难发现,归并排序的递归式满足应用情况2,可以代入后直接获得渐近界。主定理的证明比较麻烦,感兴趣的同学可以直接去参考《算法导论》。

    NP完全性

    一般情况下,我们认为多项式时间内可解(时间复杂度为O(n^k))的问题是易于处理的,超多项式复杂度的问题是不易处理的。那么是否所有问题都可以在多项式时间内解决?答案是否定的!本节将研究一类称为“NP完全”的有趣问题,由于此类问题的分析有一定难度,所以本节的论述大多不会给出证明。

    P类问题指在多项式时间内可以解决的问题,NP类问题指可以在多项式时间类证明给定“解”和输入是否匹配的问题。显然P问题都是NP问题,至于NP是否等于P,目前没有定论。

    如果一个NP问题的解决难度不小于其他任何NP问题,那么我们认为此问题是NPC问题(NP完全问题)。可以发现,只要证明一个NPC问题是P问题,那么等价于证明了NP=P。

    给定一个问题B,如何证明其是NPC问题呢?假设我们已知了一个NPC问题A,那么我们只要找到一个多项式算法将A转化为B即可,因为这样保证了问题B和问题A在多项式时间因子内的难度是一样的。我们称这个方法为多项式时间归约。

    那么剩下的问题就是找到第一个NPC问题。这个问题是“电路可满足性问题”:给出一个由与或非组成的布和组合电路,那么这个电路是否是可满足的?即是否存在一个输入使得电路输出1。我们只需要证明每一个NP问题都可以多项式归约到这个问题即可,如下所示:

    由于电路可满足性问题是一个判断性问题,即其解只有“是”或“否”,那么我们也只能把判断性问题归约到它。我们将证明可以把任何可判断性的NP问题多项式归约到电路可满足性问题,这看似没法证明后者是NPC的,实则不然,因为可判断性的问题的“表达容量”相当大,几乎任何NP问题都可以转化为对应的判断性问题。

    对于任意一个判断性的NP问题L,给定输入x和“解”y(对于电路满足问题,x是电路结构,y是使电路x输出1的电路输入),必然存在算法A可以在多项式时间内判断x和y是否“匹配”。由于A是多项式时间算法,那么其执行步数和所需的内存必然都是多项式复杂度的,我们可以把算法A的执行过程展开,如下图所示:

    1bd301dc1f54a461204f4a5e295042e0.png

    我们可以把上图在多项式时间内转化为一个接受y作为输入的电路,如果这个电路是可满足的,即证明存在y使得原问题L的解为“是”。

    综上所述,电路可满足问题是NPC问题得证。

    NPC问题在很多领域都会遇到,下面将介绍几种NPC问题,其证明结构如下图所示:

    6f24d7caf0d4a98065f5edb4912d8a1f.png
    • SAT:布尔公式的可满足性问题。
    • 3-CNF-SAT:3合取范式的布尔公式的可满足性问题。
    • 团问题(clique):寻找无向图中的最大团。
    • 顶点覆盖问题(vertex cover):在无向图中找出最小规模的顶点覆盖。
    • 哈密顿回路问题(ham-cycle):无向图是否存在哈密顿回路,即通过每个顶点的简单回路。
    • 旅行商问题(TSP):寻找通过无向图每个顶点一次的最小回路。
    • 子集和问题(subset-sum):给定正整数集合和正整数t,判断是否存在一个子集的元素和为t。

    NPC问题远不止上面这些,如果大家有兴趣,建议参考一下其他资料,避免踩坑。如果要处理NPC问题,大致有以下3种方法:

    1. 若输入规模小,这采用超多项式复杂度算法直接求解。
    2. 寻找可以在多项式时间内求解的特殊情况。
    3. 采用近似算法(approximation algorithm),在多项式时间内得到最优近似解。

    本文到这里就结束了,主要围绕时间复杂度理论和NP完全性理论。

    展开全文
  • 我们已经讨论过可计算理论了,其分析哪些问题是可以被算法解决的,链接如下:yishun:可计算性理论的理解​zhuanlan.zhihu.com现在,我们来讨论算法执行的时间复杂度。算法执行的效率主要包括2个部分:一是算法运行...
  • 计算复杂度理论

    2017-08-27 15:20:31
    构造一个归约算法L’, 使得L可归约到L’,且该归约算法的复杂度是多项式的。 证明一个问题是npc问题 证明待证明的问题L是NP问题 选一个已知的NPC问题L’ 构造一个归约算法,使得L’可归约到L. 且该归约算法...
  • 比如复杂度、熵、焓,复杂度专门独立出来,成为复杂度理论 文章摘抄于:《非线性动力学》 刘秉政 编著 5.5 复杂性及其测度 热力学的几个专业术语 熵、焓、自由能、吉布斯自由能、复杂度 熵:体系混乱度...
  • 时间复杂度理论定义

    千次阅读 2016-06-17 17:24:03
    算法时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随...
  • 时间复杂度分析

    2021-12-06 18:13:17
    时间复杂度分析什么是时间复杂度什么是大O复杂表达式的化简O(logn)中的log是以什么为底时间复杂度1.png实例分析总结 时间复杂度是一个函数,它定性描述该算法的运行时间。 什么是时间复杂度 假设算法的问题规模为n,...
  • 计算理论习题解答.pdf

    2021-04-06 16:12:02
    计算理论习题解答.pdf
  • 4.机器执行的指令速度我们研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽象,而不是精确地定位需要执行多少次,因为如果这样的话,我们又得考虑编译器优化等问题。计算方法 1.一般情况下,算法...
  • 时间复杂度分析(上)

    千次阅读 2019-11-12 16:04:31
    为什么会有时间复杂度分析? 数据结构和算法解决的就是‘快’和‘省’的问题,即如何让代码跑的更快,更省存储空间。 大 O 复杂度表示法 算法的执行效率,粗略地讲,就是算法代码执行的时间 只关注循环执行次数最多...
  • 分类超曲面算法是一种简单的基于覆盖的分类算法.实验证明该算法具有分类...其次,分析了算法的时间复杂度和空间复杂度.最后,给出了无矛盾样本集的概念,并证明当输入样本集是有限无矛盾样本集的条件下,算法一定是收敛的.
  • 本文阐述了遗传禁忌搜索算法的混合策略,从理论上对该算法的收敛性进行了证明,对时间复杂度进行了分析。应用马尔科夫链模型证明了遗传禁忌搜索算法是以概率1收敛到全局最优解的,并应用求解随机算法时间复杂度的方法,...
  • 采用C0复杂度算法,分析了Logistic映射,简化Lorenz系统和超混沌Lorenz系统的复杂度特性,并与系统的Lyapunov指数谱和分岔图进行比较,结果表明,C0...为混沌系统规范信息加密,保密通信领域提供了理论与实验依据。
  • 基于TRIZ理论构建C语言课程复杂度模型.pdf
  • 时间复杂度的理解

    2021-01-06 16:55:28
    时间复杂度的理解前言定义(1)时间频度(2)时间复杂度(3)最坏时间复杂度和平均时间复杂度最坏时间复杂度和平均时间...一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。我们不可能也
  • 我把这些因素分为三大类:算法理论上的计算复杂度、开发实现的方案和硬件设备的规格。 如果将整个系统的构建比作生产汽车,那么计算复杂度相当于在蓝图设计阶段,对整个汽车的性能进行评估。如果我们能够进行准确的...
  • 函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n >...它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是
  • 对算法进行时问复杂度分析是算法分析与研究的重要内容,而对递归...提出了用组合数学中的母函数与递推关系理论来分析一些特殊的递归算法的时间复杂度,并同时得出三个推论,在算法的分析与研究方面具有一定的参考价值。
  • 电信设备-基于信息熵理论的海底地貌复杂度表示方法.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,363
精华内容 50,545
关键字:

复杂度理论