過度熱情計算(轉)

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,懶惰計算,它的核心是儘量推遲真正進行計算的時間(甚至推遲到返回了“值”之後),直至不得不做。

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