我正在尝试制作一个非平凡的计算器,如Maple,wolfram alpha和那些。纯娱乐。但我已经制定了约束条件,它必须采用纯粹严格的函数式语言。这意味着没有惰性评估和可变结构,如数组。
问题在于制作向量和矩阵的有效数据结构是什么? “简单”的回答当然是列表,但我发现它们在矩阵产品方面非常低效。为了形式化,矢量和矩阵应该是任意大小。
答案 0 :(得分:0)
您可以通过将向量和矩阵表示为维度的产品类型(例如记录或元组)以及从索引或行和列到元素值的函数来使其保持抽象。请注意,您还可以累积符号向量矩阵表达式,因此,在评估之前简化它们,以便尽可能多地消除临时值。
如果您的向量和矩阵稀疏,那么您可能希望使用字典来表示具体表示。如果它们密集,那么您可能想要使用不可变数组。
答案 1 :(得分:0)
感谢Jon
我发现了一个更好的结构,或半成品。
我使用二进制三作为结构,其中每个左子节点是具有根的子树,其是具有键值的节点,该键值是矩阵的列的下一个条目,右子节点是该行中的下一个节点。所以它看起来像
1 -- 2 -- 3
| | |
4 -- 5 -- 6
| | |
7 -- 8 -- 9
其中|是左节点, - 是树的正确节点,甚至可能不会两次表示同一节点。
所以如果我们有矩阵
1 2 3
4 5 6
7 8 9
其中node(Left,1,Right)是树的根,Left是子矩阵
4 5 6
7 8 9
其中Node(_,4,_)是此矩阵的根,Right是子矩阵
2 3
5 6
8 9
使用根节点(_,2,_)。
如果我们分析最坏的情况运行时,这最好和数组一样好。 在某些情况下,如果我们希望得到子矩阵
,它会更快5 6
8 9
我们简单地从根向左然后向右移动,我们有整棵树。 我们得到了与单链表相同的属性,因为我们可以创建一个新的矩阵或向量(1 xm或mx 1矩阵),只需添加新节点并将子节点转移到旧矩阵中的右节点,还有旧矩阵。