具有O(1)查找和O(1)切片的F#数组

时间:2014-03-16 20:19:21

标签: arrays f# functional-programming slice

我需要一个支持

的类似数组的数据结构
a.[i]

及时O(1)和

a.[i..j]

也在时间O(1)。

O(1)更新要求。实际上,我需要的是一个具有就地切片或子阵列概念的常量数组。

我当然可以从Array构建这样的东西,但如果我可以使用已经存在的东西,我会更开心吗?

1 个答案:

答案 0 :(得分:12)

为此,.NET标准库的类型为ArraySegment<'T>。不幸的是,它没有允许您分别使用ItemGetSlice语法的方法.[x].[x..y]。但是你可以添加它们:

type System.ArraySegment<'T> with

    member this.Item(x) =
        if x < 0 || x >= this.Count then
            raise (System.IndexOutOfRangeException("Index was outside the bounds of the array segment."))
        this.Array.[x + this.Offset]

    member this.GetSlice(start: int option, finish : int option) =
        let start = defaultArg start 0
        let finish = defaultArg finish (this.Count - 1)
        if start < 0 || finish >= this.Count then
            raise (System.IndexOutOfRangeException("Index was outside the bounds of the array segment."))
        new ArraySegment<'T>(this.Array, this.Offset + start, finish - start + 1)