百度空间 | 百度首页 
 
文章列表
 
您正在查看 "Taocp" 分类下的文章

2008年01月11日 星期五 下午 10:02

今天才知道,Knuth刚刚过了他70岁的生日。(http://www-cs-faculty.stanford.edu/~knuth/news.html

Knuth是这样伟大的一个人,他成为整整一个学科的精神领袖。不知这样形容他是否合适:单枪匹马确立了一门科学(使计算机编程成为一门科学),又单枪匹马灭掉了一个行业(传统排版业)。很多都以读过Knuth的书而自豪;大量的著作都因将它的书作为参考而备增光彩。Knuth对我最深刻的影响,是他的书教我在自己的专业和领域,应该怎样追求优雅和完美;而当我越陷入现实的繁复,便越想念他书中算法的优美。

贴上毕业设计致谢中的一段。致永远激励着我们的Knuth教授!

类别:Taocp | 评论(4) | 浏览()
 
2007年04月25日 星期三 上午 09:36

一个月前读TAOCP时发现题目答案有一点小问题,于是给Knuth写了一封信,告诉他这题的答案有点小的缺陷,后来我觉得这个问题根本不算什么缺陷,最多算答案叙述得不够充分。今天居然收到Knuth的信,他告诉我将改进此题的答案,同时,他搞不清楚我的姓是Jiang还是Ling.

附Knuth的回信:

Dear Jiang Ling,

Thanks for your recent note. I would like to use your improvement to
answer 5--19 in the next printings of Volume 3. Can you please tell
me the Unicode numbers that I should use when typesetting your
name in the index? (I suppose Jiang is U-59dc, and it is probably
your surname (family name). But also I know people whose family
name is Ling! So please also tell me whether I should alphabetize
your name under J or under L, according to roman spelling.
I will of course put the family name first when using
Chinese characters.)

Cordially, Don Knuth

类别:Taocp | 评论(29) | 浏览()
 
2007年03月19日 星期一 下午 07:48

今天,终于读完了《The Art of Computer Programming》第一卷"Fundamental Algorithms"。这真是一部值得仔细研读的书,遗憾的是我基本没有碰其中的习题,其中有很多非常有趣的,希望将来有机会能解决之中主要的题目。

毫无疑问这是我读过的最好的一本计算机专业书。其中的数学基础部分是我见过写得最精彩的。虽然作者自创的MIX语言是现实中不存在的语言,但稍用工夫学习后会发现这是一门非常优雅简洁的语言。"Information Structure"部分更是无比深刻而透彻。其中的每一段程序,每一个算法,都可以称为艺术品。。。

接下来准备读第三卷,希望能在毕业前读完。虽然我不觉得没完没了地读书有什么用,但它是一种生活方式,我觉得TAOCP正在改变我的思想。

类别:Taocp | 评论(6) | 浏览()
 
2007年03月19日 星期一 下午 12:18

我曾经考虑过O(1)的空间复杂度删除一棵二叉树的问题。在TAOCP中,对链式存储结构的处理已达到出神入化的境界。受其启发,我重新考虑了这个问题。其思想是利用每个节点的左指针,将后序遍历中需要压入栈的节点就地连成一个链式栈。

deleteBT(Node *btr)
{
Node *stack = NULL;
Node *p = btr->left,q;
btr->left = stack;
stack = btr;
while(stack != NULL)
{
          while(p != NULL)
          {
           q = p;
           p = q->left;
           q->left = stack;
           stack = q;
          }
          p = stack;
          if(p->right != NULL)
          {
           q = p;
           p = q->right;
           q->right = NULL;
          }
          else
          {
           stack = p->left;
           free(p);
           p = NULL;
          }
}
}

本质上,这个方法与原来的方法是一样的。但其思想更为清晰,程序的意图也表现得更为优雅,简洁。

类别:Taocp | 评论(0) | 浏览()
 
2006年12月28日 星期四 上午 10:33

关于自然数n的命题p(n)被数学归纳法MI证明当且仅当:

a)证明p(1)为真;

b)证明当p(1),p(2),...p(n)为真时,p(n+1)也为真。

现在,如何证明命题PMI:

如果p(n)被MI证明,则对任意自然数m,p(m)都为真。

要严格证明PMI,你会发现,会用到数学归纳法MI本身。这就陷入了一个循环。

严格的关于数学归纳法的讨论最终会归结到自然数的定义,和集合论公理,耿素云老师的《集合论与图论》自然数那一章提到了数学归纳法原理。

类别:Taocp | 评论(2) | 浏览()
 
2006年12月26日 星期二 下午 08:39

目前最常用的随机数产生器是下面这种模式,叫做Linear Congruential Method:

Xn+1 = (aXn + c) mod m, n >= 0

变换为k步长的形式如下:

Xn+k = (a^kXn + (a^k - 1)c/b) mod m, k >= 0,n >= 0,其中b = a - 1

Linear Congruential Method的若干问题:

1) m的选取:

m应该足够大,因为LCM法产生不同的数值最多为m个;m的选取还应该使计算机计算时尽量快。

 让m等于计算机的字长w计算起来会非常快,但人们往往选取m=w ± 1。这是因为:

如果d整除m,令 

Yn = Xn mod d,

那么

Yn+1 = (aYn + c) mod d. 

即{Xn}序列的低位会陷入一个更小的循环,这个循环的最大长度为d。即Xn序列低位的随机性没有高位的随机性强。

可以用快速的方法来计算aX mod (w+1),基于下面这个式子:

aX = q(w + 1) + (r - q) if aX = qW + r

aX mod (w-1)的计算与此类似。

2) a的选取:

a的选取应使序列的周期尽量长。

Theorem:Linear congruential sequence的周期为m当且仅当:

  i) c与m互质;

 ii) b = a - 1,对m的每一个质因数p,b是p的倍数;

iii) 如果m是4的倍数,b是4的倍数。

potency

b = a - 1,potency定义为使下式成立的最小的s:

b^s ≡ 0 (modulo m).

由于:

Xn = c(n + C(n,2)b + ... + C(n,s)b^(s-1)) mod m.

因此,s的大小,即potency,能够表征序列的随机度;如果potency太小,如为1,则Xn ≡ cn (modulo m),这显然是一个非常不随机的序列。

其他产生随机数的办法

Xn = (a1Xn-1 + ... + akXn-k) mod p,p为素数

能够产生周期最长为p^k-1的序列。

Randomizing by shuffling的办法:

利用两个随机数序列Xn和Yn,将Xn产生的数放在一个池中,然后由Yn产生一随机位置来取出这个池中的数,并将取出的随机数由新产生的Xn来填充。这个办法在某些情况下能增强随机性。

改进的办法是让Xn和Yn为同一个序列,即随机位置和池中的数值都有Xn产生。

[The art of computer programming,Random Numbers]

类别:Taocp | 评论(1) | 浏览()
 
2006年12月26日 星期二 下午 08:17

人们曾尝试用不同的方法产生随机数,包括物理的方法:如掷骰子、利用电路噪声发生器,等等。计算机产生以后,人们用计算机的办法产生随机数:比如将大量的预先由电路噪声产生器生成,并经过良好测试的随机数存放在存储器中,使用时再一个一个取出来。

上述办法的种种缺陷使人们开始寻求用计算机算法产生随机数。冯.诺依曼(John von Neumann)曾提出一个算法:每一个新的随机数是前一个随机数的平方的中间若干位。

如何保证类似这种办法产生的数是随机的,在每一个数都完全由前一个数决定的情况下?答案是这样产生的数值序列不是随机的,但它可以看起来像是随机的。

由Xn+1 = f(Xn),0<=Xn<m产生的随机数列最终会陷入一个循环,设计良好的f应使这个循环的周期尽量长。看起来复杂的随机数产生办法,如Algorithm K的"Super-random" number generator,基于随机选取的数值产生方法,很快就会陷入循环并且循环周期非常短。

练习题中提到了几种检测循环的办法,比较类似于检测单链表是否有环的算法。

[The art of computer programming,Random Numbers]

类别:Taocp | 评论(0) | 浏览()
 
     
 
 
文章分类
 
 
Cs(45)
 
Life(51)
 
Swsc(11)
 
 
 
 
 
     
 
文章存档
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     
 
最新文章评论
   

我干的
 

我想过,这事也许是上帝干的,或者宇宙自身干的。
 

你是从第一卷开始看的吗?那个mix看的不太懂,想请教一下
 

回复tanghill:是啊,当时看到这个充要定理我笑了。
 

这个太有趣了。
 
     


©2009 Baidu