У меня есть приложение, в котором эффективно использовать векторы для одной части кода. Однако во время вычислений мне нужно отслеживать некоторые элементы. Я слышал, что вы можете получить амортизированную конкатенацию O (n) из Data.Vectors (с помощью обычного трюка с увеличением массива), но я думаю, что делаю это неправильно. Итак, допустим, у нас есть следующая установка:
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
?
(++)
указано только, что это O(m+n) в худшем случае, она все же может иметь O(n ) амортизированное время выполнения. - person HaskellElephant   schedule 27.10.2011State
по какой-то причине, не связанной с этим вопросом, поэтому, если вы удалите вещи, связанные сState
, станет ясно, что вы не делаете ничего сумасшедшего: ‹!-- language: lang-hs --› add :: Vector Int -> Vector Int -> Vector Int add v1 v2 = v1 ++ v2. Вы заметили, что в документации говорится, что это выполняется за время O(n + m); что заставило вас поверить, что он должен работать быстрее? - person mergeconflict   schedule 27.10.2011