00-什么是算法

一、前言

算法是用于解决特定问题的一系列的执行步骤。
00-什么是算法_第1张图片

使用不同算法,解决同一个问题,效率可能相差非常大

二、求第n个斐波那契数(fibonacci number)

解释斐波那契数:

  • 斐波那契数列的排列是:1,1,2,3,5,8,13,21,34,55,89,144……
  • 它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。

两种解决思路:

  1. 递归
  • 第 n 项 = (n-1) + (n-2)
  • 但直接这样做会死循环,所以需要剔除 第 0 项和 第 1 项

代码 - Java 代码

public static int fib(int n) {
	// 这两个 if 判断是用来 解除死循环的。
	if (n < 0) return 0;
	if (n == 1) return 1;	
	return fib(n - 1) + fib(n - 2)
}

简化 - Java 代码

public static int fib(int n) {
	// 这个 if 判断是用来 解除死循环的。
	if (n <= 1) return n;
	return fib(n - 1) + fib(n - 2)
}

递归会有性能问题:

  • 当传入数字大的时候,比如60 ,就会等很长时间才能算出结果

第二种方法:

  • 计算 n 需要相加几次
  • n 需要相加 n - 1 次

例如:
n的个数 = 0 1 2 3 4 5 6 7
计算的值 = 0 1 1 2 3 5 8 13 …

n = 2 需要1 次
0 + 1

n = 3 需要2次
0 + 1 = 1
1 + 1 = 2

… …

n = 7 需要6次
0 + 1 = 1
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13

Java 代码:

public static int fib2(int n) {
	if (n <= 1) return n;
	int first = 0;
	int second = 1;

	for (int i = 0; i < n-1; i++){
		int sum = first + second;
		first = second;
		second = sum;
	}
	return second;
}

Swift 代码:

public func fib2(n: Int) -> Int {
        if (n <= 1){
            return n;
        }
        
        var first: Int = 0;
        var second: Int = 1;

        for _ in 0..

测试代码速度的工具
00-什么是算法_第2张图片

三、如何判断一个算法的好坏?

看下面的Java代码,想想哪个比较好

/// 计算 1 + 2 + 3 + ... + n 的和
public static int sum1(int n) {
	int result = 0;
	for (int i = 1; i <= n; i++) {
		result += i;
	}
	return result;
}

/// 计算 1 + 2 + 3 + ... + n 的和
public static int sum2(int n){
	return (1 + n) * n / 2
}

答案是:sum2 比较好,这是因为用了公式,但不是所有的计算都有公式,这时候就要凭借以下几个方面来分辨代码的好坏。

  1. 如果单从执行效率上进行评估,可能会想到这么一种方案

    • 比较不同算法对同一组输入的执行处理时间
    • 这种方案也叫做:事后统计法
  2. 事后统计法的缺点

    • 执行时间严重依赖硬件以及运行时各种不确定的环境因素
      * 依赖硬件: 比如 cpu 不同。
    • 必须编写相应的测试代码
    • 测试数据的选择比较难保证公正性
  3. 一般从以下维度来评估算法的优劣
    * 正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)
    * 时间复杂度:估算程序指令的执行次数(执行时间)
    * 程序指令 : 比如 int result = 0 ; 就是程序的一个指令。所以可以查看一个方法中有多少指令(比如按照分号来区分一个指令)。
    * 空间复杂度:估算所需占用的存储空间。

你可能感兴趣的:(算法,算法)