【发布时间】:2016-06-02 11:28:33
【问题描述】:
我想创建一个函数来创建一个无限列表,该列表接受两个数字和一个运算符作为输入,以便它可以生成算术和几何序列。
infiniteList:: (Floating a)=>a->(a->a->a)->a->[a]
infiniteList start operation changeby =
start:[(operation x changeby)| x<-(infiniteList start operation changeby)]
代码编译并正常工作:infiniteList 1 (*) 2 生成一个从 1 开始的列表,后续数字是其前一个数字的两倍。
现在我无法弄清楚“计算列表的第 n 个元素”的计算复杂性。从技术上讲,它正在执行一项操作来找出列表的每个元素。但是,如果您在 (2^k +1) 项之后,我将不得不等待计算机先完成计算 2^(k+1) 个元素。
我希望我能正确解释这一点,所以基本上我认为程序以 2^k 批次生成元素,其中 k 是整数,所以你可能正在等待 (2^(k+1)-2^ k) 计算第 (2^k +1) 个整数的时间。那么“计算列表的第 n 个元素”的计算复杂度是多少?
【问题讨论】:
-
等一下,我是不是误解了这个函数的工作原理?我认为创建的列表是递归地输入到自身中的。并且每次将其馈入自身时,列表的长度都会增加。我认为列表会加倍,因为 start:[(operation x changeby)| x
-
经验基准测试表明,正如所写,执行时间是二次方的,即使使用 -O2 编译也是如此。
-
这无关紧要,但您的
Floating a上下文完全没用,应该删除。 -
顺便说一句 - 在标题中你的意思是写 O(n^2) 而不是 O(2^n)?
标签: haskell