Data structures F#中元素查找最快的数据结构?

Data structures F#中元素查找最快的数据结构?,data-structures,f#,Data Structures,F#,我正在尝试编写一个小型的F#线性代数库(适用于矩阵较小的应用程序,因此内存不是问题),我想知道哪种数据结构在元素查找时间方面具有最佳性能特征,因为我需要它来定义矩阵运算?最有效的表示可能是可变数组(二维应该可以很好地工作)。按索引查找是O(1),因此这是最有效的。即使数组是可变的,您仍然可以使用它来开发一个不可变的(功能性的)矩阵类型-您需要做的就是避免对数组进行变异。编译器不会对此进行检查,但数据结构对于用户来说可以完全起作用 类似这样的事情可能是一个很好的起点: // Constructor

我正在尝试编写一个小型的F#线性代数库(适用于矩阵较小的应用程序,因此内存不是问题),我想知道哪种数据结构在元素查找时间方面具有最佳性能特征,因为我需要它来定义矩阵运算?

最有效的表示可能是可变数组(二维应该可以很好地工作)。按索引查找是O(1),因此这是最有效的。即使数组是可变的,您仍然可以使用它来开发一个不可变的(功能性的)矩阵类型-您需要做的就是避免对数组进行变异。编译器不会对此进行检查,但数据结构对于用户来说可以完全起作用

类似这样的事情可能是一个很好的起点:

// Constructor takes the data of the matrix
type Matrix(data:float[,]) =
  // Expose data only for private purposes (cannot be mutated by the user!)
  member private x.Data = data
  // All operations create new array as the result
  static member (+) (a:Matrix, b:Matrix) = 
    // TODO: Check that arrays have the same size
    let res = Array2D.init (a.Data.GetLength(0)) (a.Data.GetLength(1)) 
      (fun i j -> a.Data.[i, j] + a.Data.[i, j])
    new Matrix<_>(res)
//构造函数获取矩阵的数据
类型矩阵(数据:浮点[,])=
//仅出于私人目的公开数据(用户不能修改!)
成员私有x.Data=数据
//所有操作都将创建新数组作为结果
静态成员(+)(a:矩阵,b:矩阵)=
//TODO:检查数组是否具有相同的大小
设res=Array2D.init(a.Data.GetLength(0))(a.Data.GetLength(1))
(乐趣i j->a.Data.[i,j]+a.Data.[i,j])
新矩阵(res)

我有点不清楚他们在问什么

数组当然是O(1),所以我认为它们是正确的答案。(布莱恩的经验法则:如果你想让某些东西变得更快,那么在每种语言中答案都是一样的——使用一个结构数组。)

如果您需要更稀疏的内容,可以使用.NET
字典
哈希集
类(使用哈希),以及F#
映射
类型(使用树/比较)<代码>字典可能是下一个最好的尝试

但当然,我认为这在很大程度上取决于具体情况(密度、位置/访问模式等),或者根本不重要(其他因素压倒了它)


在一天结束时,就像每个性能问题一样:测量

如果“小”是二维或三维的,那么结构。对于稍大的“小”,请使用带有显式组件的引用类型。如果元素的数量超过30个,则使用单个数组,自己执行
i+n*j
。避免使用.NET的2D数组,因为它们的速度比需要的慢好几倍。真正避免元素操作的F#的
矩阵
类型,因为它会做一些疯狂的事情,比如动态调度(慢一个数量级)。数组的数组很好,但是自己编制索引允许对索引进行更多的JIT优化。

由于Brian的经验法则,我投了更高的票。当我到达终点时,我想提高投票率。回答得很好,我同意;高效代码的三个基本要素是:基准、基准、基准。据我所知,在.NET中,多维数组要比一维数组慢得多,这是需要记住的。@kvb:有趣。我不知道-你有什么推荐信吗?这适用于二维矩形阵列和“阵列阵列阵列”吗?我认为锯齿阵列(即阵列阵列阵列)的性能是合理的。然而,真正的多维阵列并没有得到很好的优化。我手头没有很好的参考资料,但请看,例如,简短而中肯。虽然答案都很好,但我会回到这里作为参考:)