【发布时间】: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