arrays - 当 Data.Vector.unfoldr 不融合时会发生什么?

标签 arrays haskell

假设我使用 unfoldr 创建一个 Vector,而不是 unfoldrN,它不会融合,所以实际上需要创建向量。系统如何决定其大小?我在文档中找不到任何有关此内容的信息。源代码显示它调用了unstream,其中有很多复杂的代码我无法理解。

最佳答案

我不完全确定,但我从 unfoldr 一直追踪到 Data.Vector.Generic.Mutable.unstream 的源代码。其文档指出:

Create a new mutable vector and fill it with elements from the 'Stream'. The vector will grow exponentially if the maximum size of the 'Stream' is unknown.

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

实际比率似乎是 2,根据 enlarge_delta 函数,该函数仅返回 max 1(长度 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)。

关于arrays - 当 Data.Vector.unfoldr 不融合时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069536/

相关文章:

c - 递增数组指针

php - 处理来自多个选择字段的数据

function - 在 Haskell 中用另一个函数作为参数提升一个函数

Haskell - 使用从 createProcess 和 CreatePipe 创建的句柄通过管道传输到 StdStream

haskell - 无法将预期类型 ‘a -> Int’ 与实际类型 ‘IOArrow String Int’ 匹配

haskell - Monad 错误(无法推断)

java - 我怎样才能将其更改为数组?

python - 如何有效地合并这两个数据集?

c - 将二维数组 (array[j][i]) 中的值输出到 Excel 中以形成包含 i 列和 j 行的表格

parsing - Haskell Parsec,将 oneOf 改编为 [String]