一起养成写作习惯!这是我参与「掘金日新计划 · 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)