本人是一个很菜很菜的初级程序员。最近开始着迷于研究算法。实现同一个功能,选用的算法不同,所消耗的时间可能会相差很大。更重要的是,代码效率的高低和代码的行数没有什么关系。不要用代码的行数来衡量代码的好坏。最近在读《数据结构与算法分析java语言描述》(《Data Structures and Algorithm Analysis in Java》)时,将书上一个简单例子中的几种算法做了junit时间测试。发现代码行数与运行时间真的没有什么关系。详细见代码片段
例:求一个序列中最大子序列和。(比如: 4, -3, 5, -2的最大子序列和就是6)
算法1:
/**
* 算法1
* @param lst
* @return
*/
public static int demo1(List<Integer> lst) {
int maxSum = 0;
for (int i = 0; i < lst.size(); i++) {
int thisSum = 0;
for (int j = i; j < lst.size(); j++) {
thisSum += lst.get(j);
if (thisSum > maxSum)
maxSum = thisSum;
}
}
return maxSum;
}
算法2:
/**
* 算法2
*
* @param lst
* @return
*/
public static int demo2(List<Integer> lst){
return demo2SumRec(lst, 0, lst.size() - 1);
}
public static int demo2SumRec(List<Integer> lst, int left, int right) {
if (left == right) {
if (lst.get(left) > 0)
return lst.get(left);
else
return 0;
}
int center = (left + right) / 2;
int maxLeftSum = demo2SumRec(lst, left, center);
int maxRightSum = demo2SumRec(lst, center + 1, right);
int maxLeftBorderSum = 0, leftBorderSum = 0;
for (int i = center; i >= left; i--) {
leftBorderSum += lst.get(i);
if (leftBorderSum > maxLeftBorderSum)
maxLeftBorderSum = leftBorderSum;
}
int maxRightBorderSum = 0, rightBorderSum = 0;
for (int i = center + 1; i <= right; i++) {
rightBorderSum += lst.get(i);
if(rightBorderSum > maxRightBorderSum)
maxRightBorderSum = rightBorderSum;
}
return demo2Max(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
}
public static int demo2Max(int maxLeft, int maxRight, int maxBorder){
if(maxLeft > maxRight){
if(maxLeft > maxBorder)
return maxLeft;
else
return maxBorder;
}
else
{
if(maxRight > maxBorder)
return maxRight;
else
return maxBorder;
}
}
测试结果(1000个随机数)
算法1:0.015s
算法2:0.000s
而最佳的算法代码如下:
public static int demo(List<Integer> lst) {
int maxSum = 0, thisSum = 0;
for (int i = 0; i < lst.size(); i++) {
thisSum += lst.get(i);
if (thisSum > maxSum)
maxSum = thisSum;
else if(thisSum < 0)
thisSum = 0;
}
return maxSum;
}