地图降低了复杂性

时间:2010-12-28 10:37:28

标签: clojure complexity-theory jvm-languages

假设我有这个输入:列表

  

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

     

(map#(reduce *%1)list-of-list3)

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

将map-reduce翻译为两个嵌套的?

所以当我在clojure REPL上运行上面的例子时,复杂性时间似乎是O(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)))时间以线性方式增加,而不是二次方。

任何人都可以说为什么?

提前致谢

2 个答案:

答案 0 :(得分:4)

它不是O(n ^ 2),它大致是O(n * m),其中n是列表的no,m是它们的长度。 还有其他因素与各种数字的长度有关。亲自动手,自己动手去看看为什么!

答案 1 :(得分:2)

  

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

不可能说,除非你告诉我们n表达式中list-of-list-3对应的内容。

顺便说一下,O(n^2)O(n*n)是二次复杂度,而不是指数复杂度。指数复杂度为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)) )