2.算法

Posted 夜行过客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.算法相关的知识,希望对你有一定的参考价值。

一.算法的概念

算法是特定问题求解步骤的描述

在计算机中表现为指令的有限序列

算法是独立存在的一种解决问题的方法和思想。

对于算法而言,语言并不重要,重要的是思想,也就是说,算法与具体的编程语言无关

二.算法和数据结构的区别

数据结构只是静态的描述了数据元素之间的关系

高效的程序需要在数据结构的基础上设计和选择算法

程序=数据结构+算法 

总结:

算法是为了解决实际问题而设计的

数据结构是算法需要处理的问题载体

数据结构与算法相辅相成

三.算法的特性

输入

  算法具有0个或多个输入

输出

  算法至少有1个或多个输出

有穷性

  算法在有限的步骤之后会自动结束而不会无限循环

确定性

  算法中的每一步都有确定的含义,不会出现二义性

可行性

  算法的每一步都是可行的

四,算法效率的度量-时间复杂度

4.1) 算法效率的度量(大o表示法)

  事前分析估算

  依据统计的方法对算法效率进行估算

4.2) 影响算法效率的主要因素

  算法采用的策略和方法

  问题的输入规模

  编译器所产生的代码

  计算机执行速度

4.3) 大O表示法的原理
大O表示法认为:一个程序转化为指令以后,不管是(加减乘法指令),每一步的运算指令,在一个特定的计算机上,运行时间是一定的。因此只要能够计算出这个程序有多少步,比方说有N步,就可以通过N,来表达出这个程序的复杂度。

算法效率严重依赖于操作(Operation)数量,就是是N的数量

在判断时首先关注操作数量的最高次项

操作数量的估算可以作为时间复杂度的估算

O(5) = O(1)

O(2n + 1) = O(2n) = O(n) 

O(n2+ n + 1) = O(n2)

O(3n3+1) = O(3n3) = O(n3)

4.4) 大O表示法的实际应用

long sum1(int n)
{
    long ret = 0;                                                   1
    int* array = (int*)malloc(n * sizeof(int));                     1
    int i = 0;                                                      1
    
    for(i=0; i<n; i++)                                              n
    {
        array[i] = i + 1;                          
    }
    
    for(i=0; i<n; i++)                                              n
    {
        ret += array[i];                          
    }
    
    free(array);                                                    1
    
    return ret;                                  
}

long sum2(int n)
{
    long ret = 0;                                                   1
    int i = 0;                                                      1
    
    for(i=1; i<=n; i++)                                             n
    {
        ret += i;                               
    }
}
long sum3(int n)
{
    long ret = 0;                                              1
    
    if( n > 0 )
    {
        ret = (1 + n) * n / 2;                                   1
    }
    
    return ret;
}

int main()
{
    printf("%d\n", sum1(100));
    printf("%d\n", sum2(100));
    printf("%d\n", sum3(100));
    
    return 0;
}

如上所示代码,通过对程序运算步数的分析,可以得出:

sum1的时间复杂度:2n+4,记作:O(2n),意思是说这个程序的执行效率是受到n的影响;

sum2的时间复杂度:n+2,记作:O(n)

sum3的时间复杂度:2,记作:O(1),意思是说这个程序能够以常量级执行完毕。

因此从时间复杂度上讲,sum3的算法较优。

 

注意1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。

注意2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。

 

以上是关于2.算法的主要内容,如果未能解决你的问题,请参考以下文章

片段(Java) | 机试题+算法思路+考点+代码解析 2023

从搜索文档中查找最小片段的算法?

7种基本排序算法的Java实现

VSCode自定义代码片段2——.vue文件的模板

如何标记从卷积神经网络的分割算法生成的图像片段?

C语言100个经典算法源码片段