过度热情计算(转)

http://cuitianyi.com/blog/%E8%BF%87%E5%BA%A6%E7%83%AD%E6%83%85%E8%AE%A1%E7%AE%97/

在Mark Allen Weiss的《数据结构与算法分析:C语言描述》中有这样一道习题(3.22a)。大意是扩展Stack这种数据结构,让它除了支持通常意义下的Push和Pop以外还要支持一个GetMin操作(取当前栈中的最小元素,并非DeleteMin),要求每个操作都要O(1)。

这道题我的解法是这样的:另外用一个栈,每当Push时在这里保存当前关于GetMin的答案。仔细品味一下这个方法,这就是over-eager evaluation(过度热情计算)!也就是说,我们在并不需要结果的时候就把结果计算出来。

对于某种数据结构,它要不断地被询问某个问题以及被修改,如果我们每次在被问及这个问题时才去计算它的答案,性能可能会不允许。但如果我们把问题的当前答案保存起来,在每次数据被修改时更新它(很可能要利用以前的答案来推得),并在被询问时直接返回保存好的答案,这可能会大大提高效率。很好的例子是一个会被经常问及所有元素平均值的集合。

与它相对的是lazy evaluation,懒惰计算,它的核心是尽量推迟真正进行计算的时间(甚至推迟到返回了“值”之后),直至不得不做。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章