【发布时间】:2011-12-16 08:51:11
【问题描述】:
我有一个应用程序,在其中一部分代码中使用向量非常有效。但是,在计算过程中,我需要跟踪一些元素。我听说您可以从 Data.Vectors 获得 O(n) 摊销连接(通过通常的数组增长技巧),但我认为我做得不对。所以假设我们有以下设置:
import Data.Vector((++),Vector)
import Prelude hiding ((++))
import Control.Monad.State.Strict
data App = S (Vector Int)
add :: Vector Int -> State App ()
add v1 = modify (\S v2 -> S (v2 ++ v1))
在这种情况下,add 是否在摊销 O(n) 时间内运行?如果没有,我怎样才能让add 做到这一点(我需要在状态中存储(forall s. MVector s Int) 吗?)。有没有更有效的方法来实现add?
【问题讨论】:
-
@hvr:不,这不是我想要的。我很确定我在我的问题中没有正确地做到这一点。但是,我不太了解 Data.Vector 库,虽然文档
(++)只声明它是 O(m+n) 最坏的情况,但它可能仍然有 O (n) 摊销运行时间。 -
所以我讨厌 StackOverflow 上的人们用问题回答问题,但我即将这样做:P - 你为什么认为你做错了?我假设您出于某种与此问题无关的原因使用
State,所以如果您将State相关的东西去掉,很明显您没有做任何疯狂的事情:
标签: haskell vector amortized-analysis