算法的基本概念(入门)

337 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

1.什么是算法:

算法(Algorithm)在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。算法+数据结构=程序。

2.算法的特性:

  • 有穷性,算法需要能在实行比较有限个流程以后终止;
  • 确切性,算法的每一流程需要有明确的界定;
  • 导入项,一个算法有0个或众多导入;
  • 导出项,一个算法有一个或众多导出;
  • 可行性,每一个运算流程都能够在比较有限时长内达到。

3.算法问题:斐波拉切数列

斐波那契数列来源于兔子繁殖问题,所以也叫兔子序列。第一年有一对小兔子,一年后成年。成年的兔子又可以生出一对小兔子,如此循环往复,每年的兔子数就构成了一个斐波那契数列。

1.递归

这是最简单,也是效率最差的一种:

    public long recursive(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        return recursive(n - 1) + recursive(n - 2);
    }

时间复杂度指数级,他的递归通项公式可以转换为一个齐次二阶常系数差分方程:
设f(n)为参数为n时的时间复杂度,很明显:f(n)=f(n-1)+f(n-2) ,且f(0)=0; f(1)=1;

时间复杂度为O(2^n)

2. 数学公式法

   有了上述时间复杂度的分析,就可以直接套用最后得出的公式,直接利用给的n计算x,时间复杂度O(logn)。因为涉及到幂运算。

3. 动态规划

   利用动态规划的思想,利用递归分析问题,找到状态转移方程,然后从第一个状态开始迭代到最终状态。

这里的状态转移方程是:f(n) = f(n - 1) + f(n - 2)   (n > 2)
初始状态:f(0) = 0; f(1) = 1;

public long addition(int n) {
        int[] result = {1, 2};
        if (n < 2) {
            return result[n];
        }
        long n1 = 0;
        long n2 = 1;
        long n3 = 0;
        for (int i = 2; i <= n; i++) {
            n3 = n1 + n2;
            n1 = n2;
            n2 = n3;
        }
        return n3;
    }

因为最多只需要一个for循环的执行时间,而for循环也只执行n次后结束,返回结果,所以:

时间复杂度为O(n)

最后给大家附一张彩蛋:(关于排序算法的各种算法复杂度分析,希望可以帮助到各位jym)

截屏2022-04-14 下午3.10.28.png