【问题标题】:Clojure Mutability: O(1) Performance to update vectorClojure 可变性:O(1) 更新向量的性能
【发布时间】:2016-06-11 19:36:21
【问题描述】:

在 Java 中,假设我有一个整数数组:int[] a = {1, 2, 3, 4, 5};。 如果我想更改数组中的一个元素,我可以通过更改内存中某个地址的数据来实现:a[2] = 9; => {1, 2, 9, 4, 5}

在 Clojure 中,我可以有一个向量:(def a [1 2 3 4 5])。 如何在保证最坏情况时间复杂度为 O(1) 的情况下更改向量中某个位置的元素?我读过assoc 关键字的平均时间复杂度为 O(1),但这不是我想要的。另外,我查看了瞬态向量,但我还没有找到一个在 O(1) 中更新向量的好且简单的示例。

【问题讨论】:

  • 你已经知道数组有 O(1) 更新,向量有平均 O(1) 更新——这两种数据类型都可以从 Clojure 中使用,这里还有问题要回答吗?跨度>
  • @noisesmith 是的,有一个问题。是否存在具有上述性能的原始 Clojure 数据结构?此外,如上所述,由于平均时间复杂度是有用的,在这种情况下它不是。 stackoverflow.com/questions/17048076/…。这张表显示 assoc 实际上是 O(logn)(以 32 为底)。它还表明,没有任何 Clojure 数据结构具有真正的 O(1) 最坏情况访问时间或更新时间。
  • 没有原语。 Clojure 是一个 java 库,如果你想要 java 数据结构,你可以在你的 Clojure 代码中使用它们。

标签: performance vector clojure functional-programming time-complexity


【解决方案1】:

在当前实现中,Clojure 向量的复杂度为 O(log_32(n))(以 32 为底的对数)。在数学上,O(log_32(n)) 与 O(log(n)) 是一样的。差异不是理论上的,而是实际的:

  • AFAICT,因为 Clojure 持久向量不能包含超过 40 亿个元素,所以 log_32(n) 永远不会大于 7。所以,在某种程度上,它是恒定的时间:)。这说明 Persistent Hash Tries 中的分支因子为 32(与许多分支因子为 2 的树数据结构不同)。
  • 恒定因素很重要! Java 数组的更新将比持久向量快得多。您不应该考虑渐近复杂性,而是想知道这个常数因素对您来说是否太大。如果是,请查看transients

【讨论】:

    【解决方案2】:

    在 Clojure 中,向量是一种特定的数据类型 - 它是不可变的并且具有 O(log_32(n)) 更新,返回一个通常在结构上与原始向量共享的新向量。

    如果你需要 O(1) 更新,你可以使用数组,所有 Java 的数据类型都可以从 Clojure 中使用。我在这里使用into 只是为了在repl 中有一个易于阅读的表示-每次使用都会创建一个新向量,因此您可能希望在对性能敏感的代码中避免这种情况。

    +user=> (def a (into-array Object [:a 1 :b "m" (java.util.Date.)]))
    #'user/a
    +user=> a
    #object["[Ljava.lang.Object;" 0x456d6c1e "[Ljava.lang.Object;@456d6c1e"]
    +user=> (into [] a)
    [:a 1 :b "m" #inst "2016-06-11T20:28:05.230-00:00"]
    +user=> (aset a 2 'new-contents)
    new-contents
    +user=> (into [] a)
    [:a 1 new-contents "m" #inst "2016-06-11T20:28:05.230-00:00"]
    

    Clojure 中有多种functions defined for working with arrays

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多