1.算法效率
算法效率包括时间复杂度和空间复杂度
2.算法的时间复杂度(时间效率)
衡量一个算法的运行速率,算法所花费的时间与其语句的执行次数成正比例,并且理论上无法计算
2.1规则
大O的渐进法:用常数1取代运行时间中的所有加法常数;修改后的运行次数函数中,只保留最高项;最高项的系数不是1就去掉系数
2.2算法的情况
最好情况(默认):任意输入规模的最大运行次数 平均情况:任意输入规模的期望运行次数(不是(最好情况+最坏情况)/2) 最好情况:任意输入规模的最小运行次数
2.3常见时间复杂度计算举例
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);
}
void func2(int N){
int count = 0;
for(int k = 0;k < 2*N;k++){
count++;
}
int M = 10;
while ((M--)>0){
count++;
}
System.out.println(count);
}
void func3(int N,int M){
int count = 0;
for (int k = 0; k < M; k++) {
count++;
}
for (int k = 0; k < N; k++) {
count++;
}
System.out.println(count);
}
void func4(int N){
int count = 0;
for (int k = 0; k < 100; k++) {
count++;
}
System.out.println(count);
}
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;
}
}
}
int binarySearch(int[] array,int value){
int begin = 0;
int end = array.length - 1;
while (begin <= end){
int mid = begin + (end - begin)/2;
if (array[mid]<value){
begin = mid + 1;
}else if (array[mid] > value){
end = mid - 1;
}else {
return mid;
}
}
return -1;
}
理解方式一: 理解方式二: 递归的时间复杂度 = 递归的次数 * 每次递归时执行的次数
long factorial(int N) {
return N < 2 ? N : factorial(N-1) * N;
}
int fibonacci(int N) {
return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}
3.算法的空间复杂度
衡量一个算法所需的额外空间,算法运行过程中临时占用存储空间大小,和问题的规模无关
3.1常见的空间复杂度计算举例
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]){
sorted=false;
}
}
if(sorted == true){
break;
}
}
}
int[] fibonacci(int n) {
int[] fibArray = new int[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;
}
long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}
|