1.
算法效率
算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被
称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额
外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的
迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复
杂度
2.
时间复杂度
2.1
时间复杂度的概念
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个
算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但
是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方
式。一个算法所花费的时间与其中语句的执行次数成正比例,
算法中的基本操作的执行次数,为算法的时间复
杂度。
计算func1()计算了多少次
void
func1
(
int
N
){
int
count
=
0
;
for
(
int
i
=
0
;
i
<
N
;
i
++
) {
for
(
int
j
=
0
;
j
<
N
;
j
++
) {
count
++
;
}
}
for
(
int
k
=
0
;
k
<
2
*
N
;
k
++
) {
count
++
;
}
int
M
=
10
;
while
((
M
--
)
>
0
) {
count
++
;
{
System
.
out
.
println
(
count
);
}
Func1
执行的基本操作次数 :
f(n) = n^2 + 2 * n +10
N = 10 F(N) = 130
N = 100 F(N) = 10210
N = 1000 F(N) = 1002010
空间复杂度是对一个算法在运行过程中
临时占用存储空间大小的量度
。空间复杂度不是程序占用了多少
bytes
的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度
类似,也使用
大
O
渐进表示法
。
//
计算
bubbleSort
的空间复杂度?
void
bubbleSort
(
int
[]
array
) {
for
(
int
end
=
array
.
length
;
end
>
0
;
end
--
) {
boolean
sorted
=
true
;
for
(
int
i
=
1
;
i
<
end
;
i
++
) {
if
(
array
[
i
-
1
]
>
array
[
i
]) {
Swap
(
array
,
i
-
1
,
i
);
sorted
=
false
;
}
}
if
(
sorted
==
true
) {
break
;
}
}
}
//
计算
fibonacci
的空间复杂度?
int
[]
fibonacci
(
int
n
) {
long
[]
fibArray
=
new
long
[
n
+
1
];
fibArray
[
0
]
=
0
;
fibArray
[
1
]
=
1
;
for
(
int
i
=
2
;
i
<=
n
;
i
++
) {
fibArray
[
i
]
=
fibArray
[
i
-
1
]
+
fibArray
[
i
-
2
];
}
return fibarray
}
//
计算阶乘递归
Factorial
的时间复杂度?
long
factorial
(
int
N
) {
return
N
<
2
?
N
:
factorial
(
N
-
1
)
*
N
;
}
1.
实例
1
使用了常数个额外空间,所以空间复杂度为
O(1)
2.
实例
2
动态开辟了
N
个空间,空间复杂度为
O(N)
3.
实例
3
递归调用了
N
次,开辟了
N
个栈帧,每个栈帧使用了常数个空间,空间复杂度为O(N)