标签为 "computer science" 的存档

大半年过去了

距离上次更新已经大半年过去了,在过去的时间里,我完成了肉体翻墙,在大洋彼岸安身立命。
刚来到这里时,在这个新奇的国度里,一切都是那么的不同。
可是现在看来,那些表象已经无足轻重,最大的不同只是这里更崇尚竞争与实力。
在这样的环境下,我只能抛弃混个学位,然后混碗饭吃的想法。现在的我强烈地觉得我在国内接受的本科CS教育就是一陀代谢产物,而现在的我完全就是个水货。
于是,现在的我每天在接受研究生课程的摧残的时候,还要像挤乳沟一样挤出各种时间来填补自己的基础,好让自己变成行货,至少是个伪行货。
当然,这边大公司多,机会也比较多,让我这种水货也能保存一丝就业的希望。
在这种情形下,与我志同道合的几个水货一起振臂高呼,“一切不以就业为目的的学习都是耍流氓!”。
耍了半辈子流氓的我终于在资本主义高失业率的压力下觉醒了!

以上就是我这大半年的变化,句句肺腑!

最后,应霍霍同学的强烈要求,感谢霍霍对我这个水货不离不弃!咱也时髦一把,圣瓦伦丁节快乐!

从stanford网络课程cs107学到的C语言通用类型容器设计


0 前言
最近深感自己的coding能力太差,于是很自觉地找来了stanford的网络课程来充实自己。最近在学的是由Jerry Cain主讲的Programming Paradigm课程。该课程的内容像一锅大杂烩,涵盖了C/C++,assembly,  python等程序设计语言,以及sequential / concurrent programming,procedure-oriented / object-oriented programming等多种程序设计模式。此外,该课程还捎带了计算机体系结构,操作系统,编译原理等相关课程的知识,真是琳琅满目啊!最可贵的是,该课程的assignment各个都是经过精心设计的,不但有趣而且实用,有一定的代码量和难度,做下来一定受益匪浅!

目前我学完了前10个lecture,觉得收获最大的是学会了C语言通用类型容器的设计,本篇日志将围绕这个话题展开讨论。Hope you’ll like it :)

1 为什么要写C版本的通用容器
也许我们已经习惯了C++标准库中的多种容器,比如最常用的vector,还有map,set等等。这些容器让我们彻底舍弃了恼人的数组。而C并未为我们提供这些,如果贪恋vector的便利,那么何不自己动手写一份呢?而且,使用C版本的容器在工业界是非常有现实意义的。当我们面对有限的主存时(比如手机,PDA等),通过C++通用容器生成的汇编代码会占用大量的空间。比如,当我们声明vector<int>类型的变量时,编译器会生成一份只接纳int类型的代码,当声明vector<double>时,编译器又生成了另一份代码,以此类推… 而C语言的容器会为所有的类型使用同一份代码。虽然你需要为此牺牲类型的安全性以及使用上的便利性,但是汇编代码的巨大缩减会让你觉得这是值得的。事实上,微软,苹果,Sun的系统工程师也在使用自己编写的容器来替代C++的vector以提高系统效率。

另外,正如Jerry老师在assignment 3(C语言vector和hashset的实现)的handout中所讲,“这件事儿会让你发现C原来这么牛逼,一但你成功编写,debug,用C vector做练习,你对于指针,主存,动态分配的理解会达到顶尖水平。这是我对你们的承诺。

2 C与C++相比差了什么
抛开C与C++在标准库上的差距,我们单纯从语言特性上来看看C和C++差了什么。

首先进入我脑海的是C没有reference。没关系,Jerry老师会告诉你,reference其实只是会自动dereference的pointer。两者在功能上是无差别的。其实,pointer版的swap和reference版的swap生成的汇编代码是完全一样的。

此外,C没有Class,无法隐藏结构/类的成员。Jerry老师又告诉你了,没办法,这是C的短板,在使用C容器的时候,我们就假装结构的成员变量是不可见的,只调用配套的函数,不直接对成员变量进行操作。另外,我们无法在C的struct中定义函数,于是我们无法用’.’或’->’操作符调用成员方法,只能在struct之外定义函数,并将容器指针作为参数传入。

接下来是最要紧的,C没有Template,于是乎,我们不能告诉容器它所存储的类型,配套的函数也无法得知类型信息。怎么办呢?如果没有这方便的编程经验,恐怕会对这个问题一筹莫展。下面就是我在这门课上学到的精髓:通过传递void *类型参数,辅以容器所存储的类型的size,我们就可以对所存储的类型进行各种操作。这句话可能让你摸不着头脑,没关系,我们看看下面的例子。比如,我们想在vector中存储fraction类型,fraction的定义如下:

typedef struct {
  int num;
  int denum;
} fraction;

如果是C++,我们直接通过vector<fraction>的方式在初始化的时候告诉vector它所存储的类型,通过fraction类型参数传递/操作容器外的元素。对于C语言,我们在初始化vector时传入整形参数sizeof(fraction)以利于存储空间的动态分配,容器内元素的移动等操作;而在需要对容器外元素进行操作的时候,传入void*类型参数,并对其进行强制类型转换(fraction*),然后就可以访问fraction元素了。如下例,

VectorSomeFunc(/*some parameters*/ void *elemAddr) {
  fraction *f = (fraction *)elemAddr;
  // do something to f->num or f->denum
}
fraction f;
f.num = 22;
f.denum = 7;
VectorSomeFunc(/*some parameters*/ &f);

这里使用void *类型作为函数参数是非常精妙的,因为它可以接受任何类型的指针,当我们需要用vector存储int时,我们传入int *类型的参数,需要用vector存储char *时,我们传入char **类型的参数,再分别在函数内部做(int *),(char **)的强制转换之后就可以访问元素了。正是如此,我们才实现了“通用(generic)”这两个字。这里需要提醒一下,void *类型的参数是不能够直接deference的,也就是说,不能用对void *类型的参数进行’*'和’->’操作,强制转换以后才可以。

3 管中窥豹——stack的实现
stack的实现是在cs107的课上讲到的,明白了上面的设计想法之后,比较容易实现。这里贴出源代码,并简单讨论一下。
阅读更多…

2010 FALL Computer Science申请总结

漫长的申请,从去年10月开始,一直到现在算是可以画上句号了。

先大致介绍下自己的背景。

  • 211+985非传统牛校计算机本科
  • overall GPA 84/100
  • 0906G 1450+4.5
  • 0908T 102 (22 for speaking)
  • 实验室/项目经验若干,无paper无牛推

在申请开始之时,我对自己的判断是,除了GRE成绩,其他背景全面平庸,申Ph.D吃力。咨询了活跃在各留学论坛上的W大,他给的定位是M.S. Top 30/ Ph.D 30-80。从最后的结果来看,W大的定位真的是非常准确。

我是一个懒人,且绝对算不上ambitious的那种类型,自信心一般,但却贪图学校的名声,所以在选校的过程中,我的目标从只申请Ph.D逐渐过渡到主要申请M.S.,辅以Ph.D申请。最终的选校结果也混乱无比。

下面是申请的项目与结果(绿色ad/offer,红色rej,黑色pending)。

United States Ph.D program

  1. University of Minnesota, Twin Cities / Computer Science
  2. Texas A&M University / Computer Engineering
  3. Michigan State University / Computer Science
  4. University of California, Riverside / Computer Science

可以看出,Ph.D的项目纯属瞎选的。其中TAMU是有上届的师兄去,MSU是有本校的老师利用关系直接推荐,另外两个完全是拍脑门选的,和某朝政府领导做决策完全是一个方式。 阅读更多…

U.S.News最新2010年Computer Science排名PDF打印版

2010 U.S.News Graduate School Ranking–Computer Science

原始链接 http://grad-schools.usnews.rankingsandreviews.com/best-graduate-schools/top-computer-science-schools/rankings

Rank College name Location Score
1 Carnegie Mellon University Pittsburgh, PA 5.0
1 Massachusetts Institute of Technology Cambridge, MA 5.0
1 Stanford University Stanford, CA 5.0
1 University of California–Berkeley Berkeley, CA 5.0
5 Cornell University Ithaca, NY 4.6
5 University of Illinois–Urbana-Champaign Urbana, IL 4.6
7 University of Washington Seattle, WA 4.5
8 Princeton University Princeton, NJ 4.4
8 University of Texas–Austin Austin, TX 4.4
10 Georgia Institute of Technology Atlanta, GA 4.3
11 California Institute of Technology Pasadena, CA 4.2
11 University of Wisconsin–Madison Madison, WI 4.2
13 University of Michigan–Ann Arbor Ann Arbor, MI 4.1
14 University of California–Los Angeles Los Angeles, CA 4.0
14 University of California–San Diego La Jolla, CA 4.0
14 University of Maryland–College Park College Park, MD 4.0
17 Columbia University New York, NY 3.9
17 Harvard University Cambridge, MA 3.9
17 University of Pennsylvania Philadelphia, PA 3.9
阅读更多…

【用数据说话】我所申请的一些美国学校计算机专业硕士录取人数及随想

所有数字来自AMERICAN SOCIETY FOR ENGINEERING EDUCATION

注意:下表仅仅列举了我所申请的各校的2009年Computer Science M.S.项目的数据,不含Computer Engineering M.Eng.等其他相近专业的数据;如果某校项目不叫Computer Science,则取Computer Science and Engineering之类的名称相近的项目的数据;由于不知各校使用的统计方法是否存在重复统计,所以不包含Computer Science – Computer Networks/Multimedia 之类的分方向专业的数据。

学校 性别 全日制 兼 职
The University of Texas at Austin(德州大学奥斯汀分校) 65 7
25 1
Columbia University(哥伦比亚大学) 92 113
25 22
University of California, San Diego(加州大学圣迭戈分校) 63 0
17 0
University of Southern California(南加州大学) 299 182
98 47
The Pennsylvania State University(宾州州立大学) 28 10
5 1
University of California, Irvine(加州大学欧文分校) 27 0
7 0
North Carolina State University(北卡州立大学) 135 62
55 8

值得注意的是,所谓的几个”水校”——Columbia,USC和NCSU,虽然其硕士招生人数很巨大,但是与其所招收的博士(Ph.D) 人数相比,就不显得那么大了,参考下表的Computer Science Ph.D项目的数据。 阅读更多…