数据结构---------01-复杂度(斐波那契数列)-CSDN博客

56 阅读1分钟

一直写增删改查着实提升不了自己的编码的水平,是时候提升一下自己的内功了,数据结构与算法还是非常有必要要学习一下的,仅开此栏单单为了记录自己学习数据结构 的学习进程喝进度,目标是三个月左右的时间,从链表到哈夫曼树全部掌握,已经对应的leetcode上对应的习题的编写与练习,加快自己学习的进程,茁壮成长!!!

我个人学数据结构的目的也很清晰仅仅为了提升自己

写出性能更高的程序 ◼ 快速学习新技术 ◼ 打开一扇全新的大门 ◼ 趁脑子还没生锈,攻克它。一次掌握,终生受益 记录一下第一天的学习内容,复杂度

这个测试的代码是用经典的斐波那契数列来进行测试的,简单明了言简意赅

//斐波那契数列的第一种方法
	public static int  fib1( int n) {
		if (n<=1) {
			return n;
		}
		return fib1(n-1)+fib1(n-2);
	}
	//斐波那契数列的第二种办法
	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;
	}
	public static void main(String[] args) {
		int n=35;
		Times.test("fib1", new Task() {
			public void execute() {
				System.out.println(fib1(n));
			}
		});
		Times.test("fib2", new Task() {
			public void execute() {
				System.out.println(fib2(n));
			}
		});
	}

测试用例

可以看到明显是第二种算法的效率更高,更快,这里面就牵扯到了大0算法,之前一直学部明白这个大O算法到底是怎么个意思,今天是彻底明白了!!!

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

比较不同算法对同一组输入的执行处理时间 这种方案也叫做:事后统计法
◼ 上述方案有比较明显的缺点

执行时间严重依赖硬件以及运行时各种不确定的环境因素

必须编写相应的测算代码

测试数据的选择比较难保证公正性
◼ 一般从以下维度来评估算法的优劣 正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)

时间复杂度(time complexity):估算程序指令的执行次数(执行时间)

空间复杂度(space complexity):估算所需占用的存储空间 

大O表示法(Big O)

◼ 忽略常数、系数、低阶

9 >> O(1)

2n + 3 >> O(n)

n2 + 2n + 6 >>  O(n2)

4n3 + 3n2 + 22n + 100 >> O(n3)

写法上,n3 等价于 n^3
◼ 注意:大O表示法仅仅是一种粗略的分析模型,是一种估算,能帮助我们短时间内了解一个算法的执行效率


◼ O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

当然推荐看一下这个博主对时间复杂度和空间复杂度分析的很到位

blog.csdn.net/CrankZ/arti…