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

一直写增删改查着实提升不了自己的编码的水平,是时候提升一下自己的内功了,数据结构与算法还是非常有必要要学习一下的,仅开此栏单单为了记录自己学习数据结构 的学习进程喝进度,目标是三个月左右的时间,从链表到哈夫曼树全部掌握,已经对应的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)

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

https://blog.csdn.net/CrankZ/article/details/84726408

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值