私は、コードの一部にベクトルを使うのが効率的なアプリケーションを持っています。しかし、計算中にいくつかの要素を追跡する必要があります。私はData.VectorsからO(n)償却連結を得ることができると聞いていますが(通常の配列成長トリックで)、私は正しいことをしていないと思います。だから我々は次のセットアップを持って言うことができます:Data.Vectorから償却された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))
い、この場合の償却O(n)の時間でadd
動作しますか?そうでない場合は、どうすればadd
を行うことができますか((forall s. MVector s Int)
を状態に保存する必要がありますか?)。 add
を実装する効率的な方法はありますか?
@hvr上で最も二回コピーされることを保証する、少なくとも2倍の成長、それが空きスペースに収まらない場合
StackOverflowの人々が質問のある質問に答えると嫌いですが、私はそれをやろうとしています:P - なぜあなたは「間違っている」と思いますか?私はあなたが '' State''をこの質問に無関係な何らかの理由で使用していると仮定していますので、 '' State'関連のものを取り除くと、あなたは何も狂っていないことが明らかです:<! - language:lang- > add :: Vector Int - > Vector Int - > Vector Int add v1 v2 = v1 ++ v2 - ドキュメントが* O(n + m)*時間で実行されていることに気づいた。何があなたをより速く走らせるべきだと信じさせたのですか? – mergeconflict
間違っているかもしれませんが、私は追加が 'O(n^2)*最悪の場合に終わるかもしれないことを認識していると言いたいと思っています。また、* O(n + m)*最悪の場合、何かが実行される可能性がありますが、* O(n)*で実行される可能性があることに注意してください。* MVectorが成長することができる、 /hackage.haskell.org/packages/archive/vector/0.9/doc/html/Data-Vector-Storable-Mutable.html#g:8)、どこかで聞いたと思います。私が州を含めた理由は明らかではないことが分かっています。それは私が自分のアプリケーションでやっていることであり、私は他のタイプを保存するかもしれないので全く無関係ではありません。 – HaskellElephant