当Data.Vector.unfoldr没有融合时会发生什么?

时间:2014-07-31 21:50:23

标签: arrays haskell

假设我使用Vector而不是unfoldr创建unfoldrN,并且融合,因此实际需要创建向量。系统如何决定制作它的大小?我在文档中找不到任何相关内容。源代码显示它调用unstream,它有很多复杂的代码,我无法做到头或尾。

1 个答案:

答案 0 :(得分:5)

我不完全确定,但我将源代码从unfoldr追逐到Data.Vector.Generic.Mutable.unstream。其文件说明:

  

创建一个新的可变向量并用它中的元素填充它   '流'。如果最大尺寸为,则向量将呈指数增长   'Stream'未知。

所以,我的猜测是它以小尺寸(大约10个)开始并开始填充矢量。一旦向量填满,它就会使其大小加倍(或者使其大小增大50%,或者通过其他比例增加其大小)并将旧元素复制到新向量中。指数增长确保如果用n个元素填充向量,则最多将执行O(log(n))个副本,因此总体复杂度将为O(n log(n)),这与线性时间“足够接近”

根据enlarge_delta函数,实际比率似乎为2,它只返回max 1 (length v),传递给grow,这会将许多元素添加到向量中。


Carl所述,指数复制是O(n),而不仅仅是O(n log(n))。实际上,使用ratio = 2,复制元素的数量将是(减去一些舍入)2 ^ 0 + 2 ^ 1 + ... + 2 ^(log(n))= 2 ^(log(n)+1) -1 = 2n-1,因此O(n)。