【问题标题】:Fingertree head complexityFingertree头复杂度
【发布时间】:2019-05-09 14:00:36
【问题描述】:

我刚刚第二次阅读Apfelmus' excellent introduction to Finger Trees,开始怀疑他对head的实现:

import Prelude hiding (head)

data Tree v a = Leaf   v a
              | Branch v (Tree v a) (Tree v a)

toList :: Tree v a -> [a]
toList (Leaf _ a)     = [a]
toList (Branch _ x y) = toList x ++ toList y

head :: Tree v a -> a
head (Leaf _ a)     = a
head (Branch _ x _) = head x

由于相互实现功能是一种非常好的重用代码的方式,这让我开始思考下面的实现是否会像他的原始实现一样高效(复杂性):

import Prelude -- not needed, just for making it obvious
data Tree v a = Leaf   v a
              | Branch v (Tree v a) (Tree v a) deriving Show

toList :: Tree v a -> [a]
toList (Leaf _ a)     = [a]
toList (Branch _ x y) = toList x ++ toList y

head' :: Tree v a -> a
head' = head . toList

惰性求值是否与原始实现一样高效?

【问题讨论】:

标签: haskell time-complexity finger-tree


【解决方案1】:

是的,headhead' 如果交给 GHC 应该具有相同的时间复杂度。我预计 head 会出现小的常数因子差异(对此可能有 60% 的信心——列表融合优化的东西在起作用时非常疯狂)。

【讨论】:

  • @FabianSchneider 我已删除该评论。这是由于我的草率思考。但是无论如何要回答您的问题:“空间泄漏”意味着将某些内容保留在内存中,即使以后显然不需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2016-02-13
  • 2021-04-22
  • 2012-08-14
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多