分享算法小魅力

本人是一个很菜很菜的初级程序员。最近开始着迷于研究算法。实现同一个功能,选用的算法不同,所消耗的时间可能会相差很大。更重要的是,代码效率的高低和代码的行数没有什么关系。不要用代码的行数来衡量代码的好坏。最近在读《数据结构与算法分析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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值