First they ignore you
then they ridicule you
then they fight you
then you win
    -- Mahatma Gandhi
Chinese => English     英文 => 中文             
随笔-162  评论-870  文章-0  trackbacks-0
        每个问题有很多种解法,但其中存在一种最优的算法,据我观察和思考,‘懒人’是写不出那种最优算法的,为什么呢?因为最优算法有一个很明显的特点就是算法本身集结了人类的聪明才智,让我来用一个实例来证明这个观点:

问题:
请计算当参数为 n(n很大) 时, 1-2+3-4+5-6+7+......+n 的值

‘懒人’解法:
public class Lazy {
  public static void main(String[] args) {
    int n = 10000;
    int result = 0;
    for (int i = 0, flag = 1; i < n; i++) {
      result += flag * (i + 1);
      flag = -flag;
    }
    System.out.println(result);
  }
}

‘勤人’解法:
public class Diligent {
  public static void main(String[] args) {
    int n = 10000;
    int result = 0;
    if (0 == n % 2) {
      result = -n / 2;
    } else {
      result = -n / 2 + n;  //由于-n / 2会舍弃小数部分,所以无需写成-(n - 1) / 2
    }
    System.out.println(result);
  }
}

人类的智慧为计算机担负了不少的计算量,“懒人”算法的时间复杂度为O(n),而“勤人”算法的时间复杂度仅为O(1),这题的最优算法出世了!
忠告各位喜爱编程的朋友,在解决问题之前,请可怜可怜您使用的那台精疲力尽的计算机吧,花些时间思考一下,您付出的一分一秒都会有回报的 :-)
posted on 2006-10-14 18:05 山风小子 阅读(889) 评论(10)  编辑  收藏 所属分类: Algorithmic

评论:
# re: 算法优化源于人类智慧 2006-10-14 23:19 | 马嘉楠
程序有错误啊,

if (0 == n % 2) {
result = -n / 2;
} else {
result = -(n-1) / 2 + n;
}

一般我们写完程序都会检查一下,不过很多时候很多地方我们都想当然他是正确的,所以最好还是调试以下,或者写个测试程序^+^  回复  更多评论
  
# re: 算法优化源于人类智慧 2006-10-14 23:49 | teleyic
确实差别很大,不过算法一般都是科学家研究出来的,程序员很难有这个精力去研究这些问题  回复  更多评论
  
# re: 算法优化源于人类智慧 2006-10-15 01:27 | 山风小子
To: 马嘉楠
多谢您的指教,但我确定没错,
因为-n / 2会舍弃小数部分,所以无需写成-(n - 1) / 2  回复  更多评论
  
# re: 算法优化源于人类智慧 2006-10-15 10:08 | 马嘉楠
受教了,是我想当然了,呵呵
@山风小子
  回复  更多评论
  
# re: 算法优化源于人类智慧 2006-10-15 10:24 | zeroblue
懒勤与否,好象与是否有智慧没有必然联系。
而最佳算法好象只与智慧有关系。为什么有智慧的懒人不能写出最佳算法?

: )  回复  更多评论
  
# re: 算法优化源于人类智慧 2006-10-16 11:29 | 山风小子
@zeroblue
世界上的天才少吗?有几个有作为的呢?一个很重要的原因就是自以为是,不够勤奋 :)  回复  更多评论
  
# re: 算法优化源于人类智慧 2006-10-16 11:33 | 山风小子
@马嘉楠
您太谦虚了,相互学习嘛 :)
  回复  更多评论
  
# re: 算法优化源于人类智慧 2007-05-08 11:23 | Eric.Lau
简单了一点,但说明了问题。  回复  更多评论
  
# re: 算法优化源于人类智慧 2007-05-08 12:13 | 山风小子
@Eric.Lau
简单也是一种美 :)  回复  更多评论
  
# 原来如此 2007-11-16 05:59 | 哈哈 不错
所有的奇数除与2取膜 结果都为1
好像是在做算术题
时间复杂度从10000 减小到 1次搞定
0 == n % 2 反着写,恩,好习惯!!  回复  更多评论
  

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-01-10 20:48 编辑过
 
 
相关链接:
网站导航: