【问题标题】:Functional data structure函数式数据结构
【发布时间】:2018-06-01 20:56:28
【问题描述】:

我目前正在尝试制作一个非平凡的计算器,例如 Maple、wolfram alpha 和那些。纯娱乐。但是我已经做出了限制,它必须是纯严格的函数式语言。这意味着没有惰性求值和数组等可变结构。

问题很简单,什么是制作向量和矩阵的有效数据结构? “简单”的答案当然是列表,但我发现它们在矩阵乘积方面效率极低。为了更加形式化,向量和矩阵应该是任意大小的。

【问题讨论】:

  • 您询问的是哪种特定语言?它们通常带有向量的有效实现。
  • SML 的标准基础库有一个名为Vector 的结构,它是一个具有O(1) 访问权限的不可变线性数据结构(参见sml-family.org/Basis/vector.html)。如果没有内置的语言支持,您将很难进行非平凡的线性代数(因为对于许多算法而言,不变性已经是一个主要障碍)。
  • “但是我已经做出了限制,它必须是纯严格的函数式语言。这意味着没有惰性求值......” – 为什么没有惰性求值?
  • 树和列表可以帮助您创建结构,使低摊销大 O 无需懒惰评估。基本上你会在需要时急切地去做。
  • Bergi 语言未导入。只是语法不同。

标签: data-structures functional-programming linear-algebra


【解决方案1】:

您可以通过将向量和矩阵表示为维度的产品类型(例如记录或元组)以及从索引或行和列到元素值的函数来使其抽象化。请注意,您还可以累积符号向量矩阵表达式,因此在计算之前对其进行简化,以消除尽可能多的临时变量。

如果您的向量和矩阵是稀疏的,那么您可能希望使用字典来进行具体表示。如果它们很密集,那么您可能需要使用不可变数组。

【讨论】:

    【解决方案2】:

    谢谢乔恩

    我找到了一个更好的结构,或者差不多。

    我使用二进制三作为结构,其中每个左子节点是具有根的子树,即具有键值的节点是矩阵列的下一个条目,而右子节点是行中的下一个节点。所以它看起来像

    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 x m 或 m x 1 矩阵)的新矩阵或向量,只需添加新节点并将子节点定位到旧矩阵中的正确节点,并且仍然有旧矩阵。

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多