【问题标题】:Purely functional set纯函数集
【发布时间】:2012-05-15 01:30:50
【问题描述】:

有没有实现纯函数集的算法?

预期的操作是 union, intersection, difference, element?, empty? 和 邻接

不过,这些并不是硬性要求,我很乐意学习一种只实现其中一部分的算法。

【问题讨论】:

  • 您所描述的内容不会构成算法,而是构成数据结构。这就是你要找的东西吗?
  • 你想要真正完成/做什么,在什么背景下?
  • 您是否希望它具有不可变和一致的功能(在相同的集合上调用相同的函数会产生相同的结果),或者它可能不包含状态(即使只是在内部)?
  • @yamen 不可变且持久。使用 memoization 不是问题。

标签: algorithm data-structures functional-programming set referential-transparency


【解决方案1】:

【讨论】:

    【解决方案2】:

    几乎所有数据结构都存在纯粹的功能实现。在集合或地图的情况下,您通常使用某种形式的搜索树,例如红/黑树或 AVL 树。函数式数据结构的标准参考是 Okasaki 的书:

    http://www.cambridge.org/gb/knowledge/isbn/item1161740/

    其中的重要部分可通过他的论文免费获得:

    http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf

    【讨论】:

      【解决方案3】:

      @ninjagecko 的答案中的链接很好。我最近关注的是 Clojure 中使用的持久数据结构,它们是函数式的、不可变的和持久的。

      可以在这篇由两部分组成的博文中找到对持久哈希映射实现的描述:

      http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/

      http://blog.higher-order.net/2010/08/16/assoc-and-clojures-persistenthashmap-part-ii/

      这些是在this reference request question 中找到的一些想法的实现(参见第一个答案,第一个条目)。

      来自这些结构的集合支持您需要的功能:

      http://clojure.org/data_structures#Data Structures-Sets

      剩下的就是browse the source code and try to wrap your head around it

      【讨论】:

        【解决方案4】:

        Here is OCaml 中纯函数集的实现(它是 OCaml 的标准库)。

        【讨论】:

          【解决方案5】:

          有没有实现纯函数集的算法?

          您可以使用许多不同的纯函数式数据结构来实现集合操作。有些比其他的复杂度更高。

          示例包括:

          Lists

          我们在哪里:

          List Difference:
          
          (\\) :: Eq a => [a] -> [a] -> [a]
          

          \\ 函数是列表差异((非关联)。在xs \\ ys 的结果中,依次从 xs 中删除了 ys 的每个元素(如果有)的第一次出现。因此

          union :: Eq a => [a] -> [a] -> [a]
          

          union 函数返回两个列表的列表并集。例如,

          "dog" `union` "cow" == "dogcw"
          

          第一个列表的重复项和元素会从第二个列表中删除,但如果第一个列表包含重复项,结果也会如此。它是 unionBy 的一个特例,它允许程序员提供自己的相等性测试。

          intersect :: Eq a => [a] -> [a] -> [a]
          

          intersect 函数获取两个列表的列表交集。例如,

          [1,2,3,4] `intersect` [2,4,6,8] == [2,4]
          

          如果第一个列表包含重复项,结果也会如此。

          不可变集

          可以设计更高效的数据结构来提高集合操作的复杂性。例如,Haskell 中的标准 Data.Set 库将集合实现为大小平衡的二叉树:

          这个数据结构是什么:

          data Set a    = Bin !Size !a !(Set a) !(Set a)
                        | Tip
          
          type Size     = Int
          

          产生的复杂度:

          • 联合、交叉、差异:O(n+m)

          【讨论】:

            猜你喜欢
            • 2014-04-19
            • 2019-10-05
            • 2021-05-08
            • 1970-01-01
            • 2014-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-04
            相关资源
            最近更新 更多