• 算法初探——大O表示法


     1 #include <stdio.h>
     2 #include<malloc.h>
     3 int sum2(int n)//时间复杂度为常数,记为大欧--》O(1)
     4 {
     5     int sum = 0;//1
     6     sum = (n +1)*n / 2;//2
     7     return sum;
     8 }
     9 int sum1(int n)//n-> ∞时,时间复杂度O(n)
    10 {
    11     int sum = 0;//1
    12     for (int i = 1; i <= n; i++)
    13         sum += i;//n
    14     return sum;
    15 }
    16 /*
    17 算法测试求1到n的和
    18 */
    19 int main(void)
    20 {
    21     printf("sum1=%d
    ", sum1(100));
    22     printf("sum2=%d
    ", sum2(100));
    23     return 0;
    24 }

    sum1所用指令步长明显比sum2多,sum2采用等差数列求和方式极大减少了运行时间。

    我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。

    “大O记法" :在这种描述中使用的基本参数是n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级(order),比如说“二分检索是O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法O ( f(n) )表示当n增大时,运行时间至多将以正比于f(n)的速度增长。

    这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。

    O(1)
    int a=1;int b=1;int c=1;                   
    以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

    上面使用的是时间复杂的度量。类似时间复杂度,同样有空间复杂度。空间复杂度指程序需要开辟的存储空间。

    如上代码:

     1 #include <stdio.h>
     2 #include<malloc.h>
     3 int sum2(int n)//空间复杂度 4-》O(1)
     4 {
     5     int sum = 0;//4
     6     sum = (n +1)*n / 2;//0
     7     return sum;
     8 }
     9 int sum1(int n)//空间复杂度 8-》O(1)
    10 {
    11     int sum = 0;//4
    12     for (int i = 1; i <= n; i++)//4
    13         sum += i;//0
    14     return sum;
    15 }
  • 相关阅读:
    [RxSwift]3.3、数据绑定(订阅)
    [RxSwift]3.2、函数式编程 -> 函数响应式编程
    [RxSwift]2、Hello RxSwift!:我的第一个 RxSwift 应用程序
    [RxSwift]1、为什么要使用 RxSwift ?
    [RxSwift]RxSwift: ReactiveX for Swift
    [Swift]UIViewController
    104. 二叉树的最大深度
    103. 二叉树的锯齿形层次遍历
    102. 二叉树的层序遍历
    98. 验证二叉搜索树
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6642145.html
Copyright © 2020-2023  润新知