haskell - *O(n)* "forward"Data.Vector `permute` 函数

标签 haskell

Data.Vector API 提供了一个高效的 backpermute 函数,它基本上应用了索引映射 σ -向量到向量v ,即 v'[j] = v[σ[j]] .

或以列表语法表示(为简单起见):

backpermute :: [Int] -> [a] -> [a]
backpermute σ v = map (v !!) σ

如果 !! 则可能具有 O(n) 复杂度具有 O(1) 复杂度(我假设 Data.Vector )。现在我想要逆“正向”permute操作(或用于反转 σ -vector 本身的函数),即类似(再次在列表语法中):
permute :: [Int] -> [a] -> [a]
permute σ = map snd . sortBy (comparing fst) . zip σ

invperm :: [Int] -> [Int]
invperm σ = permute σ [0..]

唉,由于 sortBy,上面的代码不是 O(n) .但是自从σ假定为前缀 [0..] 的排列permute应该可以用 Data.Vector 表示为 O(n) 算法API。

那么,如何实现高效的 O(n) permute (或者一个 O(n) invperm )根据 Data.Vector.*蜜蜂?

最佳答案

一元初始化,也许?

invSigma :: Vector Int -> Vector Int
invSigma s = create $ 
             do v <- new n
                zipWithM_ (write v) s (enumFromN 0 n)
                return v
  where n = V.length s

关于haskell - *O(n)* "forward"Data.Vector `permute` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6731679/

相关文章:

haskell - 类型构造函数柯里化(Currying)? (尝试创建一个接受一种类型的数据构造函数,另一个接受两种类型的数据构造函数)

haskell - 从具有默认值的镜头获取可能

haskell - 元组的一元更改

haskell - 如何 'show' 无法显示的类型?

haskell - 证明自由单子(monad)的仿函数定律;我做对了吗?

haskell - 推拉窗的一种

haskell - 案例陈述中的Haskell函数

design-patterns - 包含几个单子(monad)的 Haskell 设计

haskell ·帕斯卡三角形

haskell - Haskell中的交换函数