该算法每一步所做的都是当时最紧迫、最有利或许最满意的,不会思考所做的成果,直到完成任务。这种算法的稳定性很差,很简单带来严重成果,可是,若是方向正确,那该算法也是高效的。
2.分治算法(divide-and-conquer algorithm)该算法就是将一个大问题分解成许多小问题,然后独自处置这些小问题,最终将成果结合起来形成对整个问题的解决方案。当子问题和总问题类型相似时,该算法很有用,递归就归于该算法。
3.回溯算法(backtracking algorithm)也可以称之扫除算法,一种安排好的试错法。某一点,若是有多个挑选,则恣意挑选一个,若是不能解决问题则退回挑选另一个,直到找到正确的挑选。这种算法的功率很低,除非命运好。比方迷宫就可以运用这种算法来完成。
实际上,咱们对算法的功率凹凸评估,首要是在工夫和内存之间权衡。依据实际情况来决议,比方有的客户不在乎耗用的内存是多少,他在乎的是履行的速度,那么一个用内存来交换更高履行工夫的算法能够是更好的。相同,有的客户能够不想耗用过多内存一起对速度也不是独特需求。不论怎样,功率是算法的首要特性,因而重视算法的功能特别重要!规范的丈量方法就是找出一个函数(增加率),将履行工夫表明为输入巨细的函数。挑选处置的输入巨细来说增加率比拟低的算法!
核算增加率的方法:
1.丈量履行工夫经过System.currentTimeMillis()方法来测验
局部代码:
// 丈量履行工夫
static void calculate_time(){
long test_data = 1000000;
long start_time = 0;
long end_time = 0;
int testVar = 0;
for (int i = 1; i <= 5; i ){
// 算法履行前的当时工夫
start_time = System.currentTimeMillis();
for(int j = 1; j <= test_data; j ){
testVar ;
testVar--;
}
// 算法履行后的当时工夫
end_time = System.currentTimeMillis();
// 打印一共履行工夫
System.out.println("test_data = " test_data "\n"
"Time in msec = " (end_time - start_time) "ms");
//环后将循环次数加倍
test_data = test_data * 2;
}
}
以上代码将别离核算出1000000、2000000、4000000...次的循环工夫。
缺陷:
? 不相同的平台履行的工夫不相同
? 有些算法跟着输入数据的加大,测验工夫会变得不切实际!
2.指令计数指令---指编写算法的代码.对一个算法的完成代码核算履行指令次数。两种类型指令:不论输入巨细,履行次数永久不变;履行次数跟着输入巨细改动而改动。通常,咱们首要测验后一种指令。
例:核算指令履行次数
static void calculate_instruction(){
long test_data = 1000;
int work = 0;
for (int i = 1; i <= 5; i ){
int count = 0;
for (int k = 1; k <= test_data; k ){
for(int j = 1; j <= test_data; j ){
// 指令履行次数计数
count ;
work ;
work--;
}
}
System.out.println("test_data = " test_data "\n"
"Instr. count = " count );
test_data = test_data * 2;
}
}
3.代数核算代码1:
long end_time = 0;t1
int testVar = 0;t2
for (int i = 1; i <= test_data; i ){ t3
testVar ;t4
testVar--;t4
}
假定t1 --- t4别离代表每条句子的履行工夫,那么,以上代码的总履行工夫为:t1 t2 n(t3 2t4).其间n = test_data,当test_data增大时,t1和t2可以忽略不计,也就是说,关于很大的n,履行工夫可以近似于:n(t3 2t4)
4.丈量内存运用率一个算法中包括的目标和引证的数目,越多则内存运用越高,反之越低。
比拟增加率:
1.代数比拟法条件1:c≦ f(n)/g(n) ≦ d (其间c和d为正常数,n代表输入巨细)
当满意以上条件1时,则f(n)和g(n)具有相同的增加率,或许两函数复杂度的阶相同!
如:f(n) = n 100 和 g(n) = 0.1n 10两函数就具有相同的增加率。
条件2: 当n增大时,f(n)/g(n)趋向于0
当满意此条件2时,则该两个增加函数有不相同的增加率。
比方:f(n) = 10000n 20000 和 g(n) = n?2 n 1 。请咱们比拟以上两函数增加率能否相同,若是不相同,谁的增加率小?
2.大O表明法若是f的增加率小于或许等于g的增加率,则咱们可以用如下的大O表明法:
f = O(g)
O表明on the order of
将代码1的代数增加率函数用大O表达式如下:
f(n) = t1 t2 n(t3 2t4)
= a1*n a
= O(n)
其间a1 = t3 2t4; a = t1 t2
3.最佳、最差、均匀功能对每一个算法不能只思考单一的增加率,而应该给出最佳、最差、均匀的增加率函数