关于算法的意思以及时间、空间复杂度的计算方法和含义

算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法解决问题的策略机制

       算法具有5大特性

  1. 算法的确定性    :  算法的每一步必须有明确的定义
  2. 算法的有穷性    :  算法的步骤是有限个的,不会出现无法结束的情况
  3. 算法的可行性    :  算法的每一步都是可行的,任何计算步骤都可以被分解为基本的操作步骤,即每个计算步骤都可在有限时间内完成
  4. 算法的输入项    :  一个算法有0个或多个输入来刻画初始条件
  5. 算法的输出项    :  算法要有一个或多个输出,没有输出的算法是没有意义的,

算法的要求

        1. 算法能对合法的输入能够产生结果输出   
        2. 算法能对不合法的输入发出提示说明  
        3. 算法能对故意刁难的测试有满足要求的输出结果
        4. 一个好的算法是可读性强的  可以让许多程序员能够看懂理解
        5. 一个好的算法是“健壮的” :当输入类型不合理时能够做出反应而不是崩溃
        6. 还要求时间效率高,所占存储空间少

当然,上面是专家们所用精确语言解释的算法的含义,这里借用小甲鱼的比喻把算法比作泡妞儿的方法。一个好的泡妞儿的技巧要求男人们用最少的时间来泡到一个好妞儿,而一个好的算法则要求用较短的时间和较少的空间来解决问题

       而时间复杂度反映了一个算法执行所用的时间的相对快慢,而计算时间复杂度有两种方案,一种是事后统计法另一种是事前分析法,因为事后统计法估算时由于许多不确定性,比如:可能由于电脑、计算机的品牌或硬件不同的缘故导致一个相同的算法在不同的计算机上所耗费的时间不同从而影响对算法优劣的判断,所以我们通常使用事前分析法估算算法的时间复杂度。

       关与时间复杂度的实例分析:

              #include<stdio.h>

              Int main() {
                     int n = 100;

                     Int number = 0;                 

for(int I = 0; I < n; I++) {
              number += I;

}

printf(“%d”, number);

              }     

       这是一个计算从1加到100的程序,然后开始计算其时间复杂度:

Int n = 100; 和 int number = 0; 这两行各出现一次,之后是一个循环了 n(100)次number += i的循环体,最后是一行是printf(“%d”, number);

所以时间复杂度 = O(1) + O(1) + O(n) +O(1)  。 忽略掉其中的常量,所以其时间复杂度 = O(n).

我们知道,计算从1加到100(n)加还有另一种算法

              #include<stdio.h>

              Int main() {

                     Int n = 100;

                     Int number = 0;

                     number = n * (n + 1) / 2;

                     printf(“%d”,number);

              }

       这个算法的时间复杂度= O(1) +O(1) + O(1) + O(1) 总共执行了4次。

       那么显而易见,第二种算法的时间复杂度小于或等于(当n = 1 时)第一种时间复杂度,所以第二种算法优于第一种算法。

       当然还有其他的情况如1 – 100的阶乘

               #include<stdio.h>

               Int main() {
                     int number = 0;

                     for(int I = 1; I < n + 1; I ++) {

                            for(int j = 1; j < n + 1; j ++) {

                                   number += I * j;

                            }

                     }

                     printf(“%d”,number);

              }

       这个算法的空间复杂度 = O(1) + O(n^2) + O(1) 忽略掉其中常量 则其时间复杂度 = O(n^2)

       以上就是时间复杂度的计算方法,下面给大家展示其他的常见的时间复杂度

      

执行次数

名称

3(常数)

O(1)

常数阶

2n + 1

O(n)

线性阶

n^2 + 2

O(n^2)

平方阶

n log2n

O(n logn)

线性对数阶

5*Log2n + 1

O(log2n)

对数阶

2^n

O(2^n)

指数阶

n^n

O(n^n)

n次方阶

       而其中算法的时间复杂度的大小比较

O(1) < O(log2 n) < O(n) < O(n log n) < O(n^2) < ..... < O(2^n) < O(n!)

参考: https://www.cnblogs.com/fanchangfa/p/3868696.html

空间复杂度,关于一个算法的空间复杂度是对一个算法在运行过程中临时占用的空间的最大量度,其中包括输入输出数据所占的空间、算法本身需要的空间以及临时需要的空间。

因为输入输出所占的空间不随算法的不同而改变,所以要压缩空间则要精简算法的代码以达到目的。

那么如何求解算法的空间复杂度呢?S(n) = O(f(n)) 其中 n为问题运行的规模 f(n)为语句关于n所占存储空间的函数

参考: https://blog.csdn.net/qq_17534301/article/details/82872357

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值