Clojure 映射降低复杂性

Clojure 映射降低复杂性,clojure,complexity-theory,jvm-languages,Clojure,Complexity Theory,Jvm Languages,假设我有这个输入:一个列表 (def list-of-list-3(list(list 1 2 3)(list 4 5 6)(list 7 8 9)) (映射#(减少*%1)列表3) 在这种情况下,map reduce的复杂度为O(n^2) 是否将map reduce转换为两个嵌套对象? 因此,当我在clojure REPL上运行上面的示例时,复杂性时间看起来像O(n) 当我复制输入大小时(list-of-list-6(list(list)(list)1236)(list 756)(list 7

假设我有这个输入:一个列表

(def list-of-list-3(list(list 1 2 3)(list 4 5 6)(list 7 8 9))

(映射#(减少*%1)列表3)

在这种情况下,map reduce的复杂度为O(n^2)

是否将map reduce转换为两个嵌套对象?

因此,当我在clojure REPL上运行上面的示例时,复杂性时间看起来像O(n)

当我复制输入大小时(list-of-list-6(list(list)(list)1236)(list 756)(list 789)(list 823)(list 981)(list 764)),时间以线性方式增加,而不是以二次方式增加

有人能说为什么吗

提前感谢

这不是O(n^2),大致是O(n*m),其中n是列表的数量,m是列表的长度。 还有其他因素与各种数字的长度有关。用手去做,自己计时看看为什么

不是O(n^2),大致是O(n*m),其中n是列表的数量,m是列表的长度。 还有其他因素与各种数字的长度有关。用手去做,自己计时看看为什么

在这种情况下,map reduce有一个
O(n^2)
复杂度

很难说,除非您告诉我们
list-of-list-3
表达式中的
n
对应什么

顺便说一下,
O(n^2)
O(n*n)
是二次复杂度,而不是指数复杂度。指数复杂性it
O(e^n)

当我[加倍]输入大小时

( list-of-list-6 (list (list 1 2 3) (list 4 5 6) ( list 7 8 9) 
                       (list 8 2 3) (list 9 8 1) (list 7 6 4)) )
时间呈线性增长,而不是指数增长

由此,我推测
n
应该是外部列表的长度。如果是这样,那么
reduce
实际上是
O(n)
而不是
O(n^2)
。要获得二次增长,您需要将
list-of-list-6
定义为:

( list-of-list-6 (list (list 1 2 3 4 5 6) (list 4 5 6 1 3 2) 
                       (list 7 8 9 1 2 3) (list 8 2 3 2 3 4) 
                       (list 9 8 1 2 3 4) (list 7 6 4 5 6 7)) )
在这种情况下,map reduce有一个
O(n^2)
复杂度

很难说,除非您告诉我们
list-of-list-3
表达式中的
n
对应什么

顺便说一下,
O(n^2)
O(n*n)
是二次复杂度,而不是指数复杂度。指数复杂性it
O(e^n)

当我[加倍]输入大小时

( list-of-list-6 (list (list 1 2 3) (list 4 5 6) ( list 7 8 9) 
                       (list 8 2 3) (list 9 8 1) (list 7 6 4)) )
时间呈线性增长,而不是指数增长

由此,我推测
n
应该是外部列表的长度。如果是这样,那么
reduce
实际上是
O(n)
而不是
O(n^2)
。要获得二次增长,您需要将
list-of-list-6
定义为:

( list-of-list-6 (list (list 1 2 3 4 5 6) (list 4 5 6 1 3 2) 
                       (list 7 8 9 1 2 3) (list 8 2 3 2 3 4) 
                       (list 9 8 1 2 3 4) (list 7 6 4 5 6 7)) )

是的,斯蒂芬。n是外部列表的大小。m代表内部列表。复杂度为n*m。在最坏的情况下,大O是二次的。不同意,请看下面我的答案。n是外部列表的大小。m代表内部列表。复杂度为n*m。在最坏的情况下,Big-O是二次的。不同意,请看下面我的答案。从标记列表中删除“java”是个好主意。这个实现看起来像一个LISP变体。是的,David,我会的。这种变体称为Clojure,另一种JVM语言。真的很酷!我的下一个语言将是scala或clojure:从标记列表中删除“java”是个好主意。这个实现看起来像一个LISP变体。是的,David,我会的。这种变体称为Clojure,另一种JVM语言。真的很酷!我的下一个语言将是scala或clojure:D