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