数据结构的引出:
基础知识点(补充)
方法和函数:
方法(method):依赖对象来调用的函数,所以方法是一种特殊的函数。
函数(function):拥有独立功能的代码块,与对象无关。
通过上述的描述,我们可以明白方法是一个特殊的函数。我们的Java是一门纯面向对象的语言,所以,Java中只存在方法。而C语言中,是通过独立的代码块来执行程序的,即只存在函数。现下所流行的Python内存在函数和方法的。
常见的简单算法
1.求和:问题描述:求0到n的和
a:通过简单的数学求和公式可以求得:
不管公式多么复杂,只要是可以用数学公式来标识的,它的时间复杂度就是O(1)
public static int getSum1(int n){
return (1+n)*n*1/2;
}
b.通过for循环
public static int getSum2(int n) {
int total=0;
for(int i=1;i<n+1;i++){
total +=i;
}
return total;
}
c.通过递归计算求得
public static int getSum3(int n) {
return n>1? n+getSum3(n-1):1;
}
2.求阶乘:
a.通过for循环求阶乘
public static int getFact1(int n) {
int total=1;
for(int i=1;i<n+1;i++){
total *=i;
}
return total;
}
b.通过递归计算求得
public static int getFact2(int n) {
return n>1? n*getFact2(n-1):1;
}
3.斐波那契数列:
斐波那契数列即兔子数列,指的是一组以1,1为前两项,从第三项开始每一项都等于前两项的和。示例:1,1,2,3,5,8,13,21,34…
a.通过for循环求阶乘
public static int fib1(int n){
int first=1,second=1,next=0;
if (n <= 2){
return 1;
}else {
for (int i = 3; i <= n; i++) {
next = first + second;
first = second;
second = next;
}
}
return next;
}
b.通过for循环求阶乘(改良版,减少变量的使用)
public static int fib2(int n){
int a=0,b=1;
for(int i=0;i<n;i++){
b=a+b;
a=b-a;
}
return a;
}
.通过递归计算求得
public static int fib3(int n) {
return n>2? fib3(n-1)+fib3(n-2):1;
}
斐波那契时间复杂度和空间复杂度
- 利用for循环
时间 | 空间 |
---|---|
O(n) | O(1) |
- 利用递归
时间 | 空间 |
---|---|
O(2^n) | O(n) |
总结:
对于同一个问题来说,我们可以用很多种不同的思路去解决这个问题。解决这个问题需要我们去消耗时间和空间资源,但是对于我们的学习工作,这些资源是有限的,所以这就需要我们使用尽可能少的资源去解决问题。由此,我们就可以引入到我们接下来对于数据结构和算法的学习中去。