假设我有这个输入:列表
(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)))时间以线性方式增加,而不是二次方。
任何人都可以说为什么?
提前致谢
答案 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)) )