博文

李开复:算法的力量(2007-11-09 21:51:00)

摘要:算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。
算法与我
当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:“知道为什么只有你们系要加一个‘科学’,而没有‘物理科学系’或‘化学科学系’吗?因为人家是真的科学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。”其实,这点他们彻底弄错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。
记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。
还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊讶的是,他们还为此发表了不少文章,甚至......

阅读全文(2164) | 评论:0

程序员怎样学数学(2007-11-09 21:48:00)

摘要:自从我读了Johnny von Neumann的传记,我已经为弥补我糟糕的数学技能花了15个月了.读了大量的数学书籍,不过呢,似乎我还有更多没有读.当然我会接着做的.
现在我就来告诉你这些.

这并不包括传统的智慧

首先:程序员不认为他们需要了解数学.我常常听到这样的话;我不知道还有会不同意这个的.甚至于以前是主修数学的程序员也告诉我他们真的不是常常使用到数学!他们说 更重要的是要去了解设计模式,面向对象原理,软件工具,界面设计,以及一些类似的东西.

你了解吗?他们完全正确.你不需要了解很多数学你就能做个很棒,很专业的程序员.

但是呢,同时你也不是真的需要知道如何来编程.我们要面对的是:有很多专业的程序员,他们认识到他们不是非常擅长数学,但他们还是寻找方法去提升.

如果你突然觉得自己好烂,周围的人都远远的超过你,你会怎么想呢?好,你可能会发现自己善于项目管理,或者人事管理,或者界面设计,或技术写作,或者系统管理,还有许多其他程序员不必去精通的.你会开始堆积那些想法(因为工作永远干不完),当你发现一些你能掌握的东西时,你很可能会转移去全职的做这个工作.

实际上,我认为有些东西你不需要了解,当目前你还能够赖以生存.

所以他们是对的:你不需要了解数学,并且没有她你也能过的很好.

但是最近我学到一些东西可能会让你也感到惊喜:

在你知道如何编程之后,数学更容易学会.实际上,如果你先学数学,然后半路出家做程序员的话,你会发现编程简直就是小菜一碟.

学校里教数学的方式都错了.仅仅是教学的方法错了,不是教数学本身错.如果你以正确 的方式学习数学的话,你会学的更快,记住这会更长,但对你作为一个程序员来说也更有价值.

哪怕了解一点点相关的数学知识就能让你写出可爱有趣的程序,否则会有些小难度.换 句话讲,数学是可以慢慢学的,只要你有时间.

没人能了解所有的数学,就是最棒的数学家也不是.数学领域正不断的扩展,当人们发明 新的形式去解决自己的问题时.一些给出的数学问题,也正如编程,不止一种方法可以去 解决他.你可以挑个你最喜欢的.

数学是......嗯,请别告诉别人我说过这个哈;当然我也不指望谁能邀请我参加这......

阅读全文(2249) | 评论:2

实现直接插入排序 --- 算法开篇(二)(2007-10-29 15:44:00)

摘要:这篇文章主要着重讲下直接插入排序算法的分析过程与源代码实现方法: 直接插入排序算法原理,在这里我不多说了,各位可以参考<<算法导论中文版>>这本书。 这里的算法实现主要把整型变量r作为监视哨,存放待插入的记录。监视哨有两个作用:一个用来备份待插入的记录,以便前面关键字较大的记录后移;二是防止关键字比较时越界,当待插入记录list[i]比较到r时能结束比较。 直接插入排序的C#实现代码: using System;
using System.Collections.Generic;
using System.Text; namespace DataStructureConsoleApplication
{
   public class InsertSort
    {
        public void Sort(int[] list)
        {
            int i, j;
            for (i = 1; i < list.Length; i++)
            {
                int r = list[i];//将待插入的记录存放到监视哨r中。
               ......

阅读全文(4221) | 评论:2

实现定制集合类 --- 基础篇(2007-10-28 23:33:00)

摘要:实现代码原理如下: 1、继承一个CollectionBase抽象类,该类又继承IList, ICollection, IEnumerable接口。而该抽象类提供一套的抽象方法并且提供数据结构InnerList(ArrayList)来定制自己的集合类。后续文章会介绍一下ArrayList这个数据结构。 2、实现代码如下:  using System;
using System.Collections.Generic;
using System.Collections;
using System.Text; namespace DataStructureConsoleApplication
{
    class CollectionProgram:CollectionBase
    {
       //implementing the Add Method using the ArrayList
        public void Add(object item)
        {
            InnerList.Add(item);
        }
        //implementing the Remove Method using the ArrayList
        public void Remove(object item)
        {
  &......

阅读全文(2302) | 评论:0

使用泛型进行变量的交换-算法开篇(一)(2007-10-28 14:31:00)

摘要:实现原理代码如下(对算法稍有了解都会明白原理的:)): using System;
using System.Collections.Generic;
using System.Collections;
using System.Text; namespace DataStructureConsoleApplication
{
    class GenericProgram
    {
        //exchange the variables using the generic
        static void Swap<T>(ref T val1, ref T val2)
        {
            T temp;
            temp = val1;
            val1 = val2;
            val2 = temp;
       
        }
        static void Main(string[] args)
   ......

阅读全文(2361) | 评论:0