gpt4 book ai didi

f# - 类似于 C++ 引用访问?

转载 作者:行者123 更新时间:2023-12-04 10:03:43 26 4
gpt4 key购买 nike

我正在用 C++ 构建一个聚类算法,但我不能很好地处理 OOP 和发生变化的变量(成员数据)的状态。对于某种复杂的算法,我发现这是我发展的障碍。

因此,我正在考虑将编程语言更改为一种功能语言:Ocaml 或 F#。除了必须改变我对如何处理编程的心态之外,我还需要澄清一些事情。在 C++ 中,我使用双端队列在数据中滑动一个时间窗口。一段时间后,最旧的数据将被删除并附加较新的数据。还不太旧的数据保留在双端队列中。

另一项要求更高的任务是比较每个对象的属性。每个对象都是某个时间段的数据。如果我在某个时间窗口有 1000 个数据对象,我需要将每个对象与没有或 20 或 30 个进行比较,具体取决于。并且被比较的对象的某些属性可能会因为这种比较而改变。在 C++ 中,我使用引用来完成这一切,这意味着我访问内存中的对象,它们永远不会被复制,因此算法全速运行(以我对 C++ 的了解)。

我一直在阅读有关函数式编程的内容,我得到的想法是每个函数都执行一些操作并且原始数据(输入)没有改变。这意味着该语言复制数据结构并执行所需的转换。如果是这样,使用函数式编程将大大延迟算法的执行。它是否正确?如果没有,即如果有一种快速的方法来执行数据转换,是否可以告诉我如何做到这一点?一个非常小的例子会很棒。

我希望有某种设施。我读过 Ocaml 和 F# 都用于研究和科学项目。

最佳答案

在高层次上,您的问题是使用不可变数据是否比使用可变数据慢。答案是肯定的,在某些情况下速度较慢。 (对我来说)令人惊讶的是罚款是多么的小。在大多数情况下(根据我的经验),额外的时间(通常是日志因素)值得使用不可变数据的额外模块化和清晰性。在许多其他情况下,根本没有惩罚。

它没有您期望的那么慢的主要原因是您可以自由地重用旧数据的任何部分。无需担心计算的其他部分稍后会更改数据:它是不可变的!

出于类似的原因,对不可变数据的所有访问都类似于 C++ 中的引用。无需复制数据,因为计算的其他部分无法更改它。

如果您想以这种方式工作,您需要对数据进行结构化以获得一些重用。如果你不能轻易做到这一点,你可能想要使用一些(受控的)突变。

OCaml 和 F# 都是混合范式语言。如果您愿意,它们允许您使用可变数据。

对不可变数据(恕我直言)的操作最有启发性的说明是 Chris Okasaki 的书 Purely Functional Data Structures . (此亚马逊链接仅供引用,不一定建议购买该书 :-) 您还可以在 Okasaki 的 Phd thesis 中找到大部分此类信息.

关于f# - 类似于 C++ 引用访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274026/

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