gpt4 book ai didi

arrays - 有没有比 F# 中的 append 更有效的向数组添加尾部的方法?

转载 作者:行者123 更新时间:2023-12-04 16:27:46 25 4
gpt4 key购买 nike

我目前正在尝试构建一个程序,其中我有一个递归函数,该函数为每个循环将一个新元素 append 到它正在构建的数组中。我不想多次使用 append 函数,因为我的函数应该执行大量循环,而且我从以前的经验中了解到 append 函数通常需要很多时间。我试图到处寻找一个函数,该函数只是将一个元素添加到数组的尾部,但我没有发现任何此类。所以我想我会在这里问。

所以我的问题基本上是:“有没有比使用 append 更有效的方法将一个元素添加到数组的后面?”

更新了一个关于上一个的新问题

所以我使用了一个列表,将每个新元素作为头部插入,并在函数完成后恢复列表。这使该功能快了大约 70 倍。但问题仍然存在,因为我有另一个功能几乎相同的功能,它变得慢了大约 4 倍,增加了我的主要功能的总时间。功能非常相似。第一个函数(变得更快的那个)产生整数,将每个新的整数添加到列表中。第二个函数(变慢的那个)生成一个对象,将每个新对象添加到列表中。有谁知道为什么一个函数变得如此之快而另一个函数变得如此缓慢?

最佳答案

ResizeArray是用于此任务的更有效的数据结构,例如:

let filterRange predicate (i, j) =
let results = ResizeArray(j-i+1)
for k = i to j do
if predicate k then results.Add(k)
results.ToArray()

ResizeArray module来自 F# PowerPack提供高阶函数来操作 ResizeArray以一种功能性的方式。但是,请注意这些函数会创建新的 ResizeArray使它们比 .NET 方法效率低的实例。

一个纯函数式的替代方法是使用列表作为累加器,将元素添加到累加器,反转它(如果顺序很重要)并最终转换为 Array:
let filterRange predicate (i, j) =
    let rec loop k acc =
        if k = j+1 then acc
        elif predicate k then loop (k+1) (k::acc)
        else loop (k+1) acc
    loop i [] |> List.rev |> Array.ofList

关于arrays - 有没有比 F# 中的 append 更有效的向数组添加尾部的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com