本文主要是介绍过度热情计算(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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,懒惰计算,它的核心是尽量推迟真正进行计算的时间(甚至推迟到返回了“值”之后),直至不得不做。
这篇关于过度热情计算(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!